authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-09-29 17:45:27+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-09-30 00:09:24+03:00
logb3c6d774d292e6e4ddf4cd54455c4ef3c6386d66
tree782ba20f4fa00b095b1aec1db866833947b53882
parent409cf4aeb826d8f7c35f0aa10bb0a8fe45188555

stage2: improve error message for missing member in file root struct

* the root struct decl name is fully qualified this prevents error messages containing 'main.main' * avoid declared here note when file struct is missing a member It always points at the start of the file which might contain another container misleading the user.

8 files changed, 12 insertions(+), 11 deletions(-)

src/Module.zig+1
...@@ -4435,6 +4435,7 @@ pub fn semaFile(mod: *Module, file: *File) SemaError!void {...@@ -4435,6 +4435,7 @@ pub fn semaFile(mod: *Module, file: *File) SemaError!void {
4435 new_decl.alive = true; // This Decl corresponds to a File and is therefore always alive.4435 new_decl.alive = true; // This Decl corresponds to a File and is therefore always alive.
4436 new_decl.analysis = .in_progress;4436 new_decl.analysis = .in_progress;
4437 new_decl.generation = mod.generation;4437 new_decl.generation = mod.generation;
4438 new_decl.name_fully_qualified = true;
44384439
4439 if (file.status == .success_zir) {4440 if (file.status == .success_zir) {
4440 assert(file.zir_loaded);4441 assert(file.zir_loaded);
src/Sema.zig+5
...@@ -4353,6 +4353,11 @@ fn failWithBadMemberAccess(...@@ -4353,6 +4353,11 @@ fn failWithBadMemberAccess(
4353 .Enum => "enum",4353 .Enum => "enum",
4354 else => unreachable,4354 else => unreachable,
4355 };4355 };
4356 if (sema.mod.declIsRoot(agg_ty.getOwnerDecl())) {
4357 return sema.fail(block, field_src, "root struct of file '{}' has no member named '{s}'", .{
4358 agg_ty.fmt(sema.mod), field_name,
4359 });
4360 }
4356 const msg = msg: {4361 const msg = msg: {
4357 const msg = try sema.errMsg(block, field_src, "{s} '{}' has no member named '{s}'", .{4362 const msg = try sema.errMsg(block, field_src, "{s} '{}' has no member named '{s}'", .{
4358 kw_name, agg_ty.fmt(sema.mod), field_name,4363 kw_name, agg_ty.fmt(sema.mod), field_name,
test/cases/aarch64-macos/hello_world_with_updates.0.zig+1-2
...@@ -2,5 +2,4 @@...@@ -2,5 +2,4 @@
2// output_mode=Exe2// output_mode=Exe
3// target=aarch64-macos3// target=aarch64-macos
4//4//
5// :109:9: error: struct 'tmp.tmp' has no member named 'main'5// :109:9: error: root struct of file 'tmp' has no member named 'main'
6// :7:1: note: struct declared here
test/cases/compile_errors/bogus_compile_var.zig+1-2
...@@ -5,5 +5,4 @@ export fn entry() usize { return @sizeOf(@TypeOf(x)); }...@@ -5,5 +5,4 @@ export fn entry() usize { return @sizeOf(@TypeOf(x)); }
5// backend=stage25// backend=stage2
6// target=native6// target=native
7//7//
8// :1:29: error: struct 'builtin.builtin' has no member named 'bogus'8// :1:29: error: root struct of file 'builtin' has no member named 'bogus'
9// :1:1: note: struct declared here
test/cases/compile_errors/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig+1-1
...@@ -7,5 +7,5 @@ export fn entry() void {...@@ -7,5 +7,5 @@ export fn entry() void {
7// backend=stage27// backend=stage2
8// target=native8// target=native
9//9//
10// :2:27: error: expected type 'u32', found 'tmp.tmp'10// :2:27: error: expected type 'u32', found 'tmp'
11// :1:1: note: struct declared here11// :1:1: note: struct declared here
test/cases/x86_64-linux/hello_world_with_updates.0.zig+1-2
...@@ -2,5 +2,4 @@...@@ -2,5 +2,4 @@
2// output_mode=Exe2// output_mode=Exe
3// target=x86_64-linux3// target=x86_64-linux
4//4//
5// :109:9: error: struct 'tmp.tmp' has no member named 'main'5// :109:9: error: root struct of file 'tmp' has no member named 'main'
6// :7:1: note: struct declared here
test/cases/x86_64-macos/hello_world_with_updates.0.zig+1-2
...@@ -2,5 +2,4 @@...@@ -2,5 +2,4 @@
2// output_mode=Exe2// output_mode=Exe
3// target=x86_64-macos3// target=x86_64-macos
4//4//
5// :109:9: error: struct 'tmp.tmp' has no member named 'main'5// :109:9: error: root struct of file 'tmp' has no member named 'main'
6// :7:1: note: struct declared here
test/cases/x86_64-windows/hello_world_with_updates.0.zig+1-2
...@@ -2,5 +2,4 @@...@@ -2,5 +2,4 @@
2// output_mode=Exe2// output_mode=Exe
3// target=x86_64-windows3// target=x86_64-windows
4//4//
5// :130:9: error: struct 'tmp.tmp' has no member named 'main'5// :130:9: error: root struct of file 'tmp' has no member named 'main'
6// :7:1: note: struct declared here