diff --git a/src/Sema.zig b/src/Sema.zig index 0ca92fb649..b93a892dcc 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -5658,14 +5658,14 @@ fn lookupInNamespace( const src_file = block.namespace.file_scope; const gpa = sema.gpa; - var checked_namespaces: std.AutoArrayHashMapUnmanaged(*Namespace, void) = .{}; + var checked_namespaces: std.AutoArrayHashMapUnmanaged(*Namespace, bool) = .{}; defer checked_namespaces.deinit(gpa); // Keep track of name conflicts for error notes. var candidates: std.ArrayListUnmanaged(Decl.Index) = .{}; defer candidates.deinit(gpa); - try checked_namespaces.put(gpa, namespace, {}); + try checked_namespaces.put(gpa, namespace, namespace.file_scope == src_file); var check_i: usize = 0; while (check_i < checked_namespaces.count()) : (check_i += 1) { @@ -5674,7 +5674,7 @@ fn lookupInNamespace( // Skip decls which are not marked pub, which are in a different // file than the `a.b`/`@hasDecl` syntax. const decl = mod.declPtr(decl_index); - if (decl.is_pub or src_file == decl.getFileScope()) { + if (decl.is_pub or (src_file == decl.getFileScope() and checked_namespaces.values()[check_i])) { try candidates.append(gpa, decl_index); } } @@ -5693,7 +5693,7 @@ fn lookupInNamespace( try sema.ensureDeclAnalyzed(sub_usingnamespace_decl_index); const ns_ty = sub_usingnamespace_decl.val.castTag(.ty).?.data; const sub_ns = ns_ty.getNamespace().?; - try checked_namespaces.put(gpa, sub_ns, {}); + try checked_namespaces.put(gpa, sub_ns, src_file == sub_usingnamespace_decl.getFileScope()); } } diff --git a/test/behavior/usingnamespace.zig b/test/behavior/usingnamespace.zig index 83f720ff85..97ab86b172 100644 --- a/test/behavior/usingnamespace.zig +++ b/test/behavior/usingnamespace.zig @@ -75,3 +75,7 @@ test { const a = AA.b(42); try expect(a.x == AA.c().expected); } + +comptime { + _ = @import("usingnamespace/file_1.zig"); +} diff --git a/test/behavior/usingnamespace/file_0.zig b/test/behavior/usingnamespace/file_0.zig new file mode 100644 index 0000000000..584f583c56 --- /dev/null +++ b/test/behavior/usingnamespace/file_0.zig @@ -0,0 +1 @@ +pub const A = 123; diff --git a/test/behavior/usingnamespace/file_1.zig b/test/behavior/usingnamespace/file_1.zig new file mode 100644 index 0000000000..971fb8958d --- /dev/null +++ b/test/behavior/usingnamespace/file_1.zig @@ -0,0 +1,9 @@ +const std = @import("std"); +const expect = std.testing.expect; +const imports = @import("imports.zig"); + +const A = 456; + +test { + try expect(imports.A == 123); +} diff --git a/test/behavior/usingnamespace/imports.zig b/test/behavior/usingnamespace/imports.zig new file mode 100644 index 0000000000..bbbc7dd8ca --- /dev/null +++ b/test/behavior/usingnamespace/imports.zig @@ -0,0 +1,5 @@ +const file_0 = @import("file_0.zig"); +const file_1 = @import("file_1.zig"); + +pub usingnamespace file_0; +pub usingnamespace file_1;