ast.table: fix aggregate field type equality check (#11210)

pull/11219/head
spaceface 2021-08-18 13:09:54 +02:00 committed by GitHub
parent eee71cebd4
commit d2ce1f74d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 2 deletions

View File

@ -412,9 +412,14 @@ fn (t &Table) register_aggregate_field(mut sym TypeSymbol, name string) ?StructF
if !found_once { if !found_once {
found_once = true found_once = true
new_field = type_field new_field = type_field
} else if !new_field.equals(type_field) { } else if new_field.typ != type_field.typ {
return error('field `${t.type_to_str(typ)}.$name` type is different') return error('field `${t.type_to_str(typ)}.$name` type is different')
} }
new_field = StructField{
...new_field
is_mut: new_field.is_mut && type_field.is_mut
is_pub: new_field.is_pub && type_field.is_pub
}
} else { } else {
return error('type `${t.type_to_str(typ)}` has no field or method `$name`') return error('type `${t.type_to_str(typ)}` has no field or method `$name`')
} }

View File

@ -193,7 +193,9 @@ fn (a Alfa) letter() rune {
struct Bravo { struct Bravo {
// A field so that Alfa and Bravo structures aren't the same // A field so that Alfa and Bravo structures aren't the same
dummy_field int dummy_field int
char rune = `b` pub mut:
// NB: the `char` field is not `pub` or `mut` in all sumtype variants, but using it in aggregates should still work
char rune = `b`
} }
fn (b Bravo) letter() rune { fn (b Bravo) letter() rune {