authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-01-15 14:06:59+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-01-17 20:28:43+02:00
log6b037bad590bd6c319af336b6d3017c33d6834ba
tree86557878d6d467a6836c6dd1c74028c6f3b21120
parent94be9dcc7f2ff81c3433cd2f8bb32f7ea53ba7cf

Sema: ignore dependency loops in typeinfo decls

This matches stage1 behavior. Closes #14322

2 files changed, 14 insertions(+), 0 deletions(-)

src/Sema.zig+1
......@@ -16258,6 +16258,7 @@ fn typeInfoNamespaceDecls(
1625816258 for (decls) |decl_index| {
1625916259 const decl = sema.mod.declPtr(decl_index);
1626016260 if (decl.kind == .@"usingnamespace") {
16261 if (decl.analysis == .in_progress) continue;
1626116262 try sema.mod.ensureDeclAnalyzed(decl_index);
1626216263 var buf: Value.ToTypeBuffer = undefined;
1626316264 const new_ns = decl.val.toType(&buf).getNamespace().?;
test/behavior/type_info.zig+13
......@@ -590,3 +590,16 @@ test "@typeInfo decls and usingnamespace" {
590590 try expectEqualStrings(decls[1].name, "y");
591591 try expectEqualStrings(decls[2].name, "z");
592592}
593
594test "@typeInfo decls ignore dependency loops" {
595 const S = struct {
596 fn Def(comptime T: type) type {
597 std.debug.assert(@typeInfo(T).Struct.decls.len == 1);
598 return struct {
599 const foo = u32;
600 };
601 }
602 usingnamespace Def(@This());
603 };
604 _ = S.foo;
605}