diff --git a/releasenotes.md b/releasenotes.md index a94a89fe8..77b5ac30c 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -13,6 +13,7 @@ - Improve error message when using keywords as functions/macros/variables #2133. - Deprecate `MyEnum.elements`. - Deprecate `SomeFn.params`. +- Improve error message when encountering recursively defined structs. #2146 ### Fixes - Assert triggered when casting from `int[2]` to `uint[2]` #2115 diff --git a/src/compiler/sema_decls.c b/src/compiler/sema_decls.c index 78c292b3c..a64453d7a 100755 --- a/src/compiler/sema_decls.c +++ b/src/compiler/sema_decls.c @@ -546,6 +546,11 @@ static bool sema_analyse_struct_members(SemaContext *context, Decl *decl) // Grab the alignment of the member type AlignSize member_type_alignment; + if (type_is_user_defined(member_type) && member_type->decl->resolve_status == RESOLVE_RUNNING) + { + SEMA_ERROR(member, "Recursive defintion of %s.", type_quoted_error_string(member_type)); + return decl_poison(decl); + } if (!sema_set_abi_alignment(context, member->type, &member_type_alignment)) return decl_poison(decl); // And get the natural alignment AlignSize member_natural_alignment = sema_get_max_natural_alignment(member->type); diff --git a/test/test_suite/struct/struct_recursive.c3 b/test/test_suite/struct/struct_recursive.c3 new file mode 100644 index 000000000..3e45e317c --- /dev/null +++ b/test/test_suite/struct/struct_recursive.c3 @@ -0,0 +1,9 @@ +struct GlobalNode +{ + Ast node; +} + +struct Ast +{ + GlobalNode global; // #error: Recursive defintion of 'GlobalNode' +} \ No newline at end of file