From 6b037bad590bd6c319af336b6d3017c33d6834ba Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sun, 15 Jan 2023 14:06:59 +0200 Subject: [PATCH] Sema: ignore dependency loops in typeinfo decls This matches stage1 behavior. Closes #14322 --- src/Sema.zig | 1 + test/behavior/type_info.zig | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/src/Sema.zig b/src/Sema.zig index fcf25ab9bf..4e479d263a 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -16258,6 +16258,7 @@ fn typeInfoNamespaceDecls( for (decls) |decl_index| { const decl = sema.mod.declPtr(decl_index); if (decl.kind == .@"usingnamespace") { + if (decl.analysis == .in_progress) continue; try sema.mod.ensureDeclAnalyzed(decl_index); var buf: Value.ToTypeBuffer = undefined; const new_ns = decl.val.toType(&buf).getNamespace().?; diff --git a/test/behavior/type_info.zig b/test/behavior/type_info.zig index ef8c89bd23..419a2f231c 100644 --- a/test/behavior/type_info.zig +++ b/test/behavior/type_info.zig @@ -590,3 +590,16 @@ test "@typeInfo decls and usingnamespace" { try expectEqualStrings(decls[1].name, "y"); try expectEqualStrings(decls[2].name, "z"); } + +test "@typeInfo decls ignore dependency loops" { + const S = struct { + fn Def(comptime T: type) type { + std.debug.assert(@typeInfo(T).Struct.decls.len == 1); + return struct { + const foo = u32; + }; + } + usingnamespace Def(@This()); + }; + _ = S.foo; +}