fixed drop specialization assert for unreachable switch branches on unions

This commit is contained in:
J.Teeuwissen 2024-12-15 12:39:04 +01:00 committed by Brendan Hansknecht
parent 32e0ea38ef
commit 14a338e15b
No known key found for this signature in database
GPG key ID: 0EA784685083E75B

View file

@ -873,7 +873,7 @@ fn specialize_union<'a, 'i>(
// We know the tag, we can specialize the decrement for the tag.
UnionFieldLayouts::Found { field_layouts, tag } => {
match environment.union_children.get(symbol) {
match environment.union_children.get(&(*symbol, tag)) {
None => keep_original_decrement!(),
Some(children) => {
// TODO perhaps this allocation can be avoided.
@ -884,13 +884,11 @@ fn specialize_union<'a, 'i>(
let mut index_symbols = MutMap::default();
for (index, _layout) in field_layouts.iter().enumerate() {
for (child, t, _i) in children_clone
for (child, _i) in children_clone
.iter()
.rev()
.filter(|(_child, _t, i)| *i == index as u64)
.filter(|(_child, i)| *i == index as u64)
{
debug_assert_eq!(tag, *t);
let removed = incremented_children.pop(child);
index_symbols.entry(index).or_insert((*child, removed));
@ -1392,7 +1390,7 @@ struct DropSpecializationEnvironment<'a> {
struct_children: MutMap<Parent, Vec<'a, (Child, Index)>>,
// Keeps track of which parent symbol is indexed by which child symbol for unions
union_children: MutMap<Parent, Vec<'a, (Child, Tag, Index)>>,
union_children: MutMap<(Parent, Tag), Vec<'a, (Child, Index)>>,
// Keeps track of which parent symbol is indexed by which child symbol for boxes
box_children: MutMap<Parent, Vec<'a, Child>>,
@ -1469,9 +1467,9 @@ impl<'a> DropSpecializationEnvironment<'a> {
fn add_union_child(&mut self, parent: Parent, child: Child, tag: u16, index: Index) {
self.union_children
.entry(parent)
.entry((parent, tag))
.or_insert_with(|| Vec::new_in(self.arena))
.push((child, tag, index));
.push((child, index));
}
fn add_list_child(&mut self, parent: Parent, child: Child, index: u64) {
@ -1494,9 +1492,12 @@ impl<'a> DropSpecializationEnvironment<'a> {
res.extend(children.iter().rev().map(|(child, _)| child));
}
if let Some(children) = self.union_children.get(parent) {
res.extend(children.iter().rev().map(|(child, _, _)| child));
}
let children = self
.union_children
.iter()
.filter(|(k, _v)| k.0 == *parent)
.flat_map(|(_k, v)| v.iter().rev());
res.extend(children.map(|(child, _)| child));
if let Some(children) = self.box_children.get(parent) {
res.extend(children.iter().rev());