Fix alias handling of procedures

An incorrect memmove when overriding entities caused multiple ones to point to
the same procedure with incomplete variant data, resulting in later hiting a
compiler assertion.

Introduced delayed type checking for procedure aliases, as it was masked by
the previous error in the override logic.
This commit is contained in:
Roland Kovacs
2024-08-11 01:09:22 +02:00
parent be7a1f671c
commit 9eb7186cda
2 changed files with 15 additions and 1 deletions

View File

@@ -5676,6 +5676,18 @@ gb_internal void check_procedure_later_from_entity(Checker *c, Entity *e, char c
if ((e->flags & EntityFlag_ProcBodyChecked) != 0) {
return;
}
if ((e->flags & EntityFlag_Overridden) != 0) {
// NOTE (zen3ger) Delay checking of a proc alias until the underlying proc is checked.
GB_ASSERT(e->aliased_of != nullptr);
GB_ASSERT(e->aliased_of->kind == Entity_Procedure);
if ((e->aliased_of->flags & EntityFlag_ProcBodyChecked) != 0) {
e->flags |= EntityFlag_ProcBodyChecked;
return;
}
// NOTE (zen3ger) A proc alias *does not* have a body and tags!
check_procedure_later(c, e->file, e->token, e->decl_info, e->type, nullptr, 0);
return;
}
Type *type = base_type(e->type);
if (type == t_invalid) {
return;