diff --git a/releasenotes.md b/releasenotes.md index 1f24331a1..4d165b40b 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -66,6 +66,7 @@ - Recursively follow interfaces when looking up method. - Int128 alignment change in LLVM fixed on x64. - Fix interface lazy resolution errors. +- Interface resolution when part of generics #1348. ### Stdlib changes diff --git a/src/compiler/sema_name_resolution.c b/src/compiler/sema_name_resolution.c index 8fa06c897..acb1fb3a9 100644 --- a/src/compiler/sema_name_resolution.c +++ b/src/compiler/sema_name_resolution.c @@ -68,9 +68,10 @@ void sema_decl_stack_push(Decl *decl) static bool add_interface_to_decl_stack(SemaContext *context, Decl *decl) { + if (!sema_analyse_decl(context, decl)) return false; FOREACH(TypeInfo *, parent_interface, decl->interfaces) { - if (!sema_resolve_type_info(context, parent_interface, RESOLVE_TYPE_DEFAULT)) return false; + assert(parent_interface->resolve_status == RESOLVE_DONE); Decl *inf = parent_interface->type->decl; if (!sema_analyse_decl(context, inf)) return false; add_interface_to_decl_stack(context, inf); @@ -97,7 +98,12 @@ static bool add_members_to_decl_stack(SemaContext *context, Decl *decl) } if (decl->decl_kind == DECL_INTERFACE) { - if (!add_interface_to_decl_stack(context, decl)) return false; + FOREACH(TypeInfo *, parent_interface, decl->interfaces) + { + if (!sema_resolve_type_info(context, parent_interface, RESOLVE_TYPE_DEFAULT)) return false; + Decl *inf = parent_interface->type->decl; + if (!add_interface_to_decl_stack(context, inf)) return false; + } } if (decl_is_struct_type(decl) || decl->decl_kind == DECL_BITSTRUCT) {