record, tag, alias errors

- duplicate fields and tags are reported
- circular aliases are reported
This commit is contained in:
Folkert 2020-04-13 20:53:16 +02:00
parent 0372b34e86
commit f6af66f342
13 changed files with 679 additions and 55 deletions

View file

@ -32,24 +32,32 @@ impl Constraint {
match self {
True | SaveTheEnvironment => {}
Eq(typ, expected, _, _) => {
expected
.get_type_mut_ref()
.instantiate_aliases(aliases, var_store, introduced);
typ.instantiate_aliases(aliases, var_store, introduced);
Eq(typ, expected, _, region) => {
let expected_region = expected.get_annotation_region().unwrap_or(*region);
expected.get_type_mut_ref().instantiate_aliases(
expected_region,
aliases,
var_store,
introduced,
);
typ.instantiate_aliases(*region, aliases, var_store, introduced);
}
Lookup(_, expected, _) => {
expected
.get_type_mut_ref()
.instantiate_aliases(aliases, var_store, introduced);
Lookup(_, expected, region) => {
let expected_region = expected.get_annotation_region().unwrap_or(*region);
expected.get_type_mut_ref().instantiate_aliases(
expected_region,
aliases,
var_store,
introduced,
);
}
Pattern(_, _, typ, pexpected) => {
Pattern(region, _, typ, pexpected) => {
pexpected
.get_type_mut_ref()
.instantiate_aliases(aliases, var_store, introduced);
typ.instantiate_aliases(aliases, var_store, introduced);
.instantiate_aliases(*region, aliases, var_store, introduced);
typ.instantiate_aliases(*region, aliases, var_store, introduced);
}
And(nested) => {
@ -65,8 +73,8 @@ impl Constraint {
}
let mut introduced = ImSet::default();
for Located { value: typ, .. } in letcon.def_types.iter_mut() {
typ.instantiate_aliases(&new_aliases, var_store, &mut introduced);
for Located { region, value: typ } in letcon.def_types.iter_mut() {
typ.instantiate_aliases(*region, &new_aliases, var_store, &mut introduced);
}
letcon.defs_constraint.instantiate_aliases_help(