mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 04:48:20 +00:00
Sema: make check for namespace lookup of private declarations more strict
Previously sema only checked that the private declaration was in the same file as the lookup but now it also checks that the namespace where the decl was included from was also in the same file. Closes #13077
This commit is contained in:
parent
25c8506421
commit
9b832e7f53
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -75,3 +75,7 @@ test {
|
||||
const a = AA.b(42);
|
||||
try expect(a.x == AA.c().expected);
|
||||
}
|
||||
|
||||
comptime {
|
||||
_ = @import("usingnamespace/file_1.zig");
|
||||
}
|
||||
|
||||
1
test/behavior/usingnamespace/file_0.zig
Normal file
1
test/behavior/usingnamespace/file_0.zig
Normal file
@ -0,0 +1 @@
|
||||
pub const A = 123;
|
||||
9
test/behavior/usingnamespace/file_1.zig
Normal file
9
test/behavior/usingnamespace/file_1.zig
Normal file
@ -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);
|
||||
}
|
||||
5
test/behavior/usingnamespace/imports.zig
Normal file
5
test/behavior/usingnamespace/imports.zig
Normal file
@ -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;
|
||||
Loading…
x
Reference in New Issue
Block a user