Commit eaa6b04c3c

Veikka Tuominen <git@vexu.eu>
2022-06-09 23:11:46
Sema: skip decl causing namespace lookup when doing lookup
1 parent 0f820d0
Changed files (2)
src
test
behavior
src/Sema.zig
@@ -4967,6 +4967,8 @@ fn lookupInNamespace(
             var it = check_ns.usingnamespace_set.iterator();
             while (it.next()) |entry| {
                 const sub_usingnamespace_decl_index = entry.key_ptr.*;
+                // Skip the decl we're currently analysing.
+                if (sub_usingnamespace_decl_index == sema.owner_decl_index) continue;
                 const sub_usingnamespace_decl = mod.declPtr(sub_usingnamespace_decl_index);
                 const sub_is_pub = entry.value_ptr.*;
                 if (!sub_is_pub and src_file != sub_usingnamespace_decl.getFileScope()) {
test/behavior/basic.zig
@@ -1086,3 +1086,26 @@ test "inline call of function with a switch inside the return statement" {
     };
     try expect(S.foo(1) == 1);
 }
+
+test "namespace lookup ignores decl causing the lookup" {
+    if (builtin.zig_backend == .stage1) return error.SkipZigTest;
+    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+
+    const S = struct {
+        fn Mixin(comptime T: type) type {
+            return struct {
+                fn foo() void {
+                    const set = std.EnumSet(T.E).init(undefined);
+                    _ = set;
+                }
+            };
+        }
+
+        const E = enum { a, b };
+        usingnamespace Mixin(@This());
+    };
+    _ = S.foo();
+}