| author | |
| committer | |
| log | f2d326607505f1f16d4964a824444aaa0da2c259 |
| tree | 27e1bcdd67522c073dfbd2764e10b0d09549c58c |
| parent | f1e5a4f1639d4c571bfc26610593a15f9e0e2cf3 |
| parent | 10abffcd98f2f1ac9e8532c53820d7c1eea6d88f |
| signature | Signed by PGP key 4AEE18F83AFDEB23 |
Fix private access10 files changed, 72 insertions(+), 19 deletions(-)
lib/std/build.zig+5-5| ... | ... | @@ -284,11 +284,11 @@ pub const Builder = struct { |
| 284 | 284 | return run_step; |
| 285 | 285 | } |
| 286 | 286 | |
| 287 | fn dupe(self: *Builder, bytes: []const u8) []u8 { | |
| 287 | pub fn dupe(self: *Builder, bytes: []const u8) []u8 { | |
| 288 | 288 | return mem.dupe(self.allocator, u8, bytes) catch unreachable; |
| 289 | 289 | } |
| 290 | 290 | |
| 291 | fn dupePath(self: *Builder, bytes: []const u8) []u8 { | |
| 291 | pub fn dupePath(self: *Builder, bytes: []const u8) []u8 { | |
| 292 | 292 | const the_copy = self.dupe(bytes); |
| 293 | 293 | for (the_copy) |*byte| { |
| 294 | 294 | switch (byte.*) { |
| ... | ... | @@ -717,7 +717,7 @@ pub const Builder = struct { |
| 717 | 717 | return self.invalid_user_input; |
| 718 | 718 | } |
| 719 | 719 | |
| 720 | fn spawnChild(self: *Builder, argv: []const []const u8) !void { | |
| 720 | pub fn spawnChild(self: *Builder, argv: []const []const u8) !void { | |
| 721 | 721 | return self.spawnChildEnvMap(null, self.env_map, argv); |
| 722 | 722 | } |
| 723 | 723 | |
| ... | ... | @@ -843,7 +843,7 @@ pub const Builder = struct { |
| 843 | 843 | }) catch unreachable; |
| 844 | 844 | } |
| 845 | 845 | |
| 846 | fn updateFile(self: *Builder, source_path: []const u8, dest_path: []const u8) !void { | |
| 846 | pub fn updateFile(self: *Builder, source_path: []const u8, dest_path: []const u8) !void { | |
| 847 | 847 | if (self.verbose) { |
| 848 | 848 | warn("cp {} {} ", .{ source_path, dest_path }); |
| 849 | 849 | } |
| ... | ... | @@ -855,7 +855,7 @@ pub const Builder = struct { |
| 855 | 855 | }; |
| 856 | 856 | } |
| 857 | 857 | |
| 858 | fn pathFromRoot(self: *Builder, rel_path: []const u8) []u8 { | |
| 858 | pub fn pathFromRoot(self: *Builder, rel_path: []const u8) []u8 { | |
| 859 | 859 | return fs.path.resolve(self.allocator, &[_][]const u8{ self.build_root, rel_path }) catch unreachable; |
| 860 | 860 | } |
| 861 | 861 |
lib/std/dwarf.zig+4-4| ... | ... | @@ -121,7 +121,7 @@ const Die = struct { |
| 121 | 121 | }; |
| 122 | 122 | } |
| 123 | 123 | |
| 124 | fn getAttrString(self: *const Die, di: *DwarfInfo, id: u64) ![]const u8 { | |
| 124 | pub fn getAttrString(self: *const Die, di: *DwarfInfo, id: u64) ![]const u8 { | |
| 125 | 125 | const form_value = self.getAttr(id) orelse return error.MissingDebugInfo; |
| 126 | 126 | return switch (form_value.*) { |
| 127 | 127 | FormValue.String => |value| value, |
| ... | ... | @@ -389,7 +389,7 @@ pub const DwarfInfo = struct { |
| 389 | 389 | return self.abbrev_table_list.allocator; |
| 390 | 390 | } |
| 391 | 391 | |
| 392 | fn getSymbolName(di: *DwarfInfo, address: u64) ?[]const u8 { | |
| 392 | pub fn getSymbolName(di: *DwarfInfo, address: u64) ?[]const u8 { | |
| 393 | 393 | for (di.func_list.span()) |*func| { |
| 394 | 394 | if (func.pc_range) |range| { |
| 395 | 395 | if (address >= range.start and address < range.end) { |
| ... | ... | @@ -578,7 +578,7 @@ pub const DwarfInfo = struct { |
| 578 | 578 | } |
| 579 | 579 | } |
| 580 | 580 | |
| 581 | fn findCompileUnit(di: *DwarfInfo, target_address: u64) !*const CompileUnit { | |
| 581 | pub fn findCompileUnit(di: *DwarfInfo, target_address: u64) !*const CompileUnit { | |
| 582 | 582 | for (di.compile_unit_list.span()) |*compile_unit| { |
| 583 | 583 | if (compile_unit.pc_range) |range| { |
| 584 | 584 | if (target_address >= range.start and target_address < range.end) return compile_unit; |
| ... | ... | @@ -690,7 +690,7 @@ pub const DwarfInfo = struct { |
| 690 | 690 | return result; |
| 691 | 691 | } |
| 692 | 692 | |
| 693 | fn getLineNumberInfo(di: *DwarfInfo, compile_unit: CompileUnit, target_address: usize) !debug.LineInfo { | |
| 693 | pub fn getLineNumberInfo(di: *DwarfInfo, compile_unit: CompileUnit, target_address: usize) !debug.LineInfo { | |
| 694 | 694 | var stream = io.fixedBufferStream(di.debug_line); |
| 695 | 695 | const in = &stream.inStream(); |
| 696 | 696 | const seekable = &stream.seekableStream(); |
lib/std/dynamic_library.zig+2-2| ... | ... | @@ -33,11 +33,11 @@ const LinkMap = extern struct { |
| 33 | 33 | pub const Iterator = struct { |
| 34 | 34 | current: ?*LinkMap, |
| 35 | 35 | |
| 36 | fn end(self: *Iterator) bool { | |
| 36 | pub fn end(self: *Iterator) bool { | |
| 37 | 37 | return self.current == null; |
| 38 | 38 | } |
| 39 | 39 | |
| 40 | fn next(self: *Iterator) ?*LinkMap { | |
| 40 | pub fn next(self: *Iterator) ?*LinkMap { | |
| 41 | 41 | if (self.current) |it| { |
| 42 | 42 | self.current = it.l_next; |
| 43 | 43 | return it; |
lib/std/json.zig+1-1| ... | ... | @@ -2336,7 +2336,7 @@ pub const StringifyOptions = struct { |
| 2336 | 2336 | /// After a colon, should whitespace be inserted? |
| 2337 | 2337 | separator: bool = true, |
| 2338 | 2338 | |
| 2339 | fn outputIndent( | |
| 2339 | pub fn outputIndent( | |
| 2340 | 2340 | whitespace: @This(), |
| 2341 | 2341 | out_stream: var, |
| 2342 | 2342 | ) @TypeOf(out_stream).Error!void { |
lib/std/net.zig+1-1| ... | ... | @@ -386,7 +386,7 @@ pub const AddressList = struct { |
| 386 | 386 | addrs: []Address, |
| 387 | 387 | canon_name: ?[]u8, |
| 388 | 388 | |
| 389 | fn deinit(self: *AddressList) void { | |
| 389 | pub fn deinit(self: *AddressList) void { | |
| 390 | 390 | // Here we copy the arena allocator into stack memory, because |
| 391 | 391 | // otherwise it would destroy itself while it was still working. |
| 392 | 392 | var arena = self.arena; |
lib/std/pdb.zig+4-4| ... | ... | @@ -644,7 +644,7 @@ const MsfStream = struct { |
| 644 | 644 | return stream; |
| 645 | 645 | } |
| 646 | 646 | |
| 647 | fn readNullTermString(self: *MsfStream, allocator: *mem.Allocator) ![]u8 { | |
| 647 | pub fn readNullTermString(self: *MsfStream, allocator: *mem.Allocator) ![]u8 { | |
| 648 | 648 | var list = ArrayList(u8).init(allocator); |
| 649 | 649 | while (true) { |
| 650 | 650 | const byte = try self.inStream().readByte(); |
| ... | ... | @@ -684,13 +684,13 @@ const MsfStream = struct { |
| 684 | 684 | return buffer.len; |
| 685 | 685 | } |
| 686 | 686 | |
| 687 | fn seekBy(self: *MsfStream, len: i64) !void { | |
| 687 | pub fn seekBy(self: *MsfStream, len: i64) !void { | |
| 688 | 688 | self.pos = @intCast(u64, @intCast(i64, self.pos) + len); |
| 689 | 689 | if (self.pos >= self.blocks.len * self.block_size) |
| 690 | 690 | return error.EOF; |
| 691 | 691 | } |
| 692 | 692 | |
| 693 | fn seekTo(self: *MsfStream, len: u64) !void { | |
| 693 | pub fn seekTo(self: *MsfStream, len: u64) !void { | |
| 694 | 694 | self.pos = len; |
| 695 | 695 | if (self.pos >= self.blocks.len * self.block_size) |
| 696 | 696 | return error.EOF; |
| ... | ... | @@ -708,7 +708,7 @@ const MsfStream = struct { |
| 708 | 708 | return block * self.block_size + offset; |
| 709 | 709 | } |
| 710 | 710 | |
| 711 | fn inStream(self: *MsfStream) std.io.InStream(*MsfStream, Error, read) { | |
| 711 | pub fn inStream(self: *MsfStream) std.io.InStream(*MsfStream, Error, read) { | |
| 712 | 712 | return .{ .context = self }; |
| 713 | 713 | } |
| 714 | 714 | }; |
lib/std/zig/cross_target.zig+1-1| ... | ... | @@ -660,7 +660,7 @@ pub const CrossTarget = struct { |
| 660 | 660 | return Target.getObjectFormatSimple(self.getOsTag(), self.getCpuArch()); |
| 661 | 661 | } |
| 662 | 662 | |
| 663 | fn updateCpuFeatures(self: CrossTarget, set: *Target.Cpu.Feature.Set) void { | |
| 663 | pub fn updateCpuFeatures(self: CrossTarget, set: *Target.Cpu.Feature.Set) void { | |
| 664 | 664 | set.removeFeatureSet(self.cpu_features_sub); |
| 665 | 665 | set.addFeatureSet(self.cpu_features_add); |
| 666 | 666 | set.populateDependencies(self.getCpuArch().allFeaturesList()); |
src-self-hosted/ir/text.zig+1-1| ... | ... | @@ -236,7 +236,7 @@ pub const Inst = struct { |
| 236 | 236 | @"comptime_int", |
| 237 | 237 | @"comptime_float", |
| 238 | 238 | |
| 239 | fn toType(self: BuiltinType) Type { | |
| 239 | pub fn toType(self: BuiltinType) Type { | |
| 240 | 240 | return switch (self) { |
| 241 | 241 | .@"isize" => Type.initTag(.@"isize"), |
| 242 | 242 | .@"usize" => Type.initTag(.@"usize"), |
src/ir.cpp+9| ... | ... | @@ -21624,6 +21624,15 @@ static IrInstGen *ir_analyze_container_member_access_inner(IrAnalyze *ira, |
| 21624 | 21624 | if (tld->resolution == TldResolutionResolving) |
| 21625 | 21625 | return ir_error_dependency_loop(ira, source_instr); |
| 21626 | 21626 | |
| 21627 | if (tld->visib_mod == VisibModPrivate && | |
| 21628 | tld->import != get_scope_import(source_instr->scope)) | |
| 21629 | { | |
| 21630 | ErrorMsg *msg = ir_add_error(ira, source_instr, | |
| 21631 | buf_sprintf("'%s' is private", buf_ptr(field_name))); | |
| 21632 | add_error_note(ira->codegen, msg, tld->source_node, buf_sprintf("declared here")); | |
| 21633 | return ira->codegen->invalid_inst_gen; | |
| 21634 | } | |
| 21635 | ||
| 21627 | 21636 | TldFn *tld_fn = (TldFn *)tld; |
| 21628 | 21637 | ZigFn *fn_entry = tld_fn->fn_entry; |
| 21629 | 21638 | assert(fn_entry != nullptr); |
test/compile_errors.zig+44| ... | ... | @@ -5375,6 +5375,50 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { |
| 5375 | 5375 | break :x tc; |
| 5376 | 5376 | }); |
| 5377 | 5377 | |
| 5378 | cases.addCase(x: { | |
| 5379 | const tc = cases.create("multiple files with private member instance function (canonical invocation) error", | |
| 5380 | \\const Foo = @import("foo.zig",).Foo; | |
| 5381 | \\ | |
| 5382 | \\export fn callPrivFunction() void { | |
| 5383 | \\ var foo = Foo{}; | |
| 5384 | \\ Foo.privateFunction(foo); | |
| 5385 | \\} | |
| 5386 | , &[_][]const u8{ | |
| 5387 | "tmp.zig:5:8: error: 'privateFunction' is private", | |
| 5388 | "foo.zig:2:5: note: declared here", | |
| 5389 | }); | |
| 5390 | ||
| 5391 | tc.addSourceFile("foo.zig", | |
| 5392 | \\pub const Foo = struct { | |
| 5393 | \\ fn privateFunction(self: *Foo) void { } | |
| 5394 | \\}; | |
| 5395 | ); | |
| 5396 | ||
| 5397 | break :x tc; | |
| 5398 | }); | |
| 5399 | ||
| 5400 | cases.addCase(x: { | |
| 5401 | const tc = cases.create("multiple files with private member instance function error", | |
| 5402 | \\const Foo = @import("foo.zig",).Foo; | |
| 5403 | \\ | |
| 5404 | \\export fn callPrivFunction() void { | |
| 5405 | \\ var foo = Foo{}; | |
| 5406 | \\ foo.privateFunction(); | |
| 5407 | \\} | |
| 5408 | , &[_][]const u8{ | |
| 5409 | "tmp.zig:5:8: error: 'privateFunction' is private", | |
| 5410 | "foo.zig:2:5: note: declared here", | |
| 5411 | }); | |
| 5412 | ||
| 5413 | tc.addSourceFile("foo.zig", | |
| 5414 | \\pub const Foo = struct { | |
| 5415 | \\ fn privateFunction(self: *Foo) void { } | |
| 5416 | \\}; | |
| 5417 | ); | |
| 5418 | ||
| 5419 | break :x tc; | |
| 5420 | }); | |
| 5421 | ||
| 5378 | 5422 | cases.add("container init with non-type", |
| 5379 | 5423 | \\const zero: i32 = 0; |
| 5380 | 5424 | \\const a = zero{1}; |