assert that no tag union or record with no fields/tags makes it into Subs

This commit is contained in:
Folkert 2021-11-21 22:25:03 +01:00
parent 5415f458b1
commit 8afdf282cb
2 changed files with 20 additions and 0 deletions

View file

@ -686,6 +686,10 @@ fn type_to_variable<'a>(
register(subs, rank, pools, content) register(subs, rank, pools, content)
} }
Record(fields, ext) => { Record(fields, ext) => {
// An empty fields is inefficient (but would be correct)
// If hit, try to turn the value into an EmptyRecord in canonicalization
debug_assert!(!fields.is_empty() || !ext.is_empty_record());
let mut field_vars = Vec::with_capacity_in(fields.len(), arena); let mut field_vars = Vec::with_capacity_in(fields.len(), arena);
for (field, field_type) in fields { for (field, field_type) in fields {
@ -714,6 +718,10 @@ fn type_to_variable<'a>(
register(subs, rank, pools, content) register(subs, rank, pools, content)
} }
TagUnion(tags, ext) => { TagUnion(tags, ext) => {
// An empty tags is inefficient (but would be correct)
// If hit, try to turn the value into an EmptyTagUnion in canonicalization
debug_assert!(!tags.is_empty() || !ext.is_empty_tag_union());
let (union_tags, ext) = type_to_union_tags(subs, rank, pools, arena, tags, ext); let (union_tags, ext) = type_to_union_tags(subs, rank, pools, arena, tags, ext);
let content = Content::Structure(FlatType::TagUnion(union_tags, ext)); let content = Content::Structure(FlatType::TagUnion(union_tags, ext));
@ -742,6 +750,10 @@ fn type_to_variable<'a>(
register(subs, rank, pools, content) register(subs, rank, pools, content)
} }
RecursiveTagUnion(rec_var, tags, ext) => { RecursiveTagUnion(rec_var, tags, ext) => {
// An empty tags is inefficient (but would be correct)
// If hit, try to turn the value into an EmptyTagUnion in canonicalization
debug_assert!(!tags.is_empty() || !ext.is_empty_tag_union());
let (union_tags, ext) = type_to_union_tags(subs, rank, pools, arena, tags, ext); let (union_tags, ext) = type_to_union_tags(subs, rank, pools, arena, tags, ext);
let content = let content =
Content::Structure(FlatType::RecursiveTagUnion(*rec_var, union_tags, ext)); Content::Structure(FlatType::RecursiveTagUnion(*rec_var, union_tags, ext));

View file

@ -436,6 +436,14 @@ impl Type {
matches!(self, Type::RecursiveTagUnion(_, _, _)) matches!(self, Type::RecursiveTagUnion(_, _, _))
} }
pub fn is_empty_tag_union(&self) -> bool {
matches!(self, Type::EmptyTagUnion)
}
pub fn is_empty_record(&self) -> bool {
matches!(self, Type::EmptyRec)
}
pub fn variables(&self) -> ImSet<Variable> { pub fn variables(&self) -> ImSet<Variable> {
let mut result = ImSet::default(); let mut result = ImSet::default();
variables_help(self, &mut result); variables_help(self, &mut result);