Commit 5b29275240

Veikka Tuominen <git@vexu.eu>
2022-07-21 20:22:09
Sema: add some more 'declared here' notes
1 parent 881c0cb
src/Sema.zig
@@ -6814,12 +6814,7 @@ fn zirIntToEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
                     .{ dest_ty.fmt(sema.mod), int_val.fmtValue(sema.typeOf(operand), sema.mod) },
                 );
                 errdefer msg.destroy(sema.gpa);
-                try sema.mod.errNoteNonLazy(
-                    dest_ty.declSrcLoc(sema.mod),
-                    msg,
-                    "enum declared here",
-                    .{},
-                );
+                try sema.addDeclaredHereNote(msg, dest_ty);
                 break :msg msg;
             };
             return sema.failWithOwnedErrorMsg(block, msg);
@@ -19432,16 +19427,7 @@ fn fieldVal(
                             return inst;
                         }
                     }
-                    // TODO add note: declared here
-                    const kw_name = switch (child_type.zigTypeTag()) {
-                        .Struct => "struct",
-                        .Opaque => "opaque",
-                        .Union => "union",
-                        else => unreachable,
-                    };
-                    return sema.fail(block, src, "{s} '{}' has no member named '{s}'", .{
-                        kw_name, child_type.fmt(sema.mod), field_name,
-                    });
+                    return sema.failWithBadMemberAccess(block, child_type, src, field_name);
                 },
                 else => {
                     const msg = msg: {
@@ -19783,7 +19769,13 @@ fn fieldCallBind(
         else => {},
     }
 
-    return sema.fail(block, src, "type '{}' has no field or member function named '{s}'", .{ concrete_ty.fmt(sema.mod), field_name });
+    const msg = msg: {
+        const msg = try sema.errMsg(block, src, "no field or member function named '{s}' in '{}'", .{ field_name, concrete_ty.fmt(sema.mod) });
+        errdefer msg.destroy(sema.gpa);
+        try sema.addDeclaredHereNote(msg, concrete_ty);
+        break :msg msg;
+    };
+    return sema.failWithOwnedErrorMsg(block, msg);
 }
 
 fn finishFieldCallBind(
@@ -21176,16 +21168,11 @@ fn coerceExtra(
                         const msg = try sema.errMsg(
                             block,
                             inst_src,
-                            "enum '{}' has no field named '{s}'",
-                            .{ dest_ty.fmt(sema.mod), bytes },
+                            "no field named '{s}' in enum '{}'",
+                            .{ bytes, dest_ty.fmt(sema.mod) },
                         );
                         errdefer msg.destroy(sema.gpa);
-                        try sema.mod.errNoteNonLazy(
-                            dest_ty.declSrcLoc(sema.mod),
-                            msg,
-                            "enum declared here",
-                            .{},
-                        );
+                        try sema.addDeclaredHereNote(msg, dest_ty);
                         break :msg msg;
                     };
                     return sema.failWithOwnedErrorMsg(block, msg);
@@ -26230,7 +26217,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
                 const msg = msg: {
                     const tree = try sema.getAstTree(&block_scope);
                     const field_src = enumFieldSrcLoc(decl, tree.*, union_obj.node_offset, field_i);
-                    const msg = try sema.errMsg(&block_scope, field_src, "enum '{}' has no field named '{s}'", .{ union_obj.tag_ty.fmt(sema.mod), field_name });
+                    const msg = try sema.errMsg(&block_scope, field_src, "no field named '{s}' in enum '{}'", .{ field_name, union_obj.tag_ty.fmt(sema.mod) });
                     errdefer msg.destroy(sema.gpa);
                     try sema.addDeclaredHereNote(msg, union_obj.tag_ty);
                     break :msg msg;
test/cases/aarch64-macos/hello_world_with_updates.0.zig
@@ -3,3 +3,4 @@
 // target=aarch64-macos
 //
 // :107:9: error: struct 'tmp.tmp' has no member named 'main'
+// :7:1: note: struct declared here
test/cases/compile_errors/stage2/union_extra_field.zig
@@ -16,5 +16,5 @@ export fn entry() usize {
 // error
 // target=native
 //
-// :10:5: error: enum 'tmp.E' has no field named 'd'
+// :10:5: error: no field named 'd' in enum 'tmp.E'
 // :1:11: note: enum declared here
test/cases/compile_errors/bogus_compile_var.zig
@@ -6,3 +6,4 @@ export fn entry() usize { return @sizeOf(@TypeOf(x)); }
 // target=native
 //
 // :1:29: error: struct 'builtin.builtin' has no member named 'bogus'
+// :1:1: note: struct declared here
test/cases/compile_errors/bogus_method_call_on_slice.zig
@@ -8,4 +8,4 @@ export fn entry() usize { return @sizeOf(@TypeOf(&f)); }
 // backend=stage2
 // target=native
 //
-// :3:6: error: type '[]const u8' has no field or member function named 'copy'
+// :3:6: error: no field or member function named 'copy' in '[]const u8'
test/cases/compile_errors/cast_enum_literal_to_enum_but_it_doesnt_match.zig
@@ -11,5 +11,5 @@ export fn entry() void {
 // backend=stage2
 // target=native
 //
-// :6:21: error: enum 'tmp.Foo' has no field named 'c'
+// :6:21: error: no field named 'c' in enum 'tmp.Foo'
 // :1:13: note: enum declared here
test/cases/compile_errors/method_call_with_first_arg_type_primitive.zig
@@ -18,4 +18,5 @@ export fn f() void {
 // backend=stage2
 // target=native
 //
-// :14:9: error: type 'tmp.Foo' has no field or member function named 'init'
+// :14:9: error: no field or member function named 'init' in 'tmp.Foo'
+// :1:13: note: struct declared here
test/cases/compile_errors/method_call_with_first_arg_type_wrong_container.zig
@@ -27,4 +27,5 @@ export fn foo() void {
 // backend=llvm
 // target=native
 //
-// :23:6: error: type 'tmp.List' has no field or member function named 'init'
+// :23:6: error: no field or member function named 'init' in 'tmp.List'
+// :1:14: note: struct declared here
test/cases/x86_64-linux/hello_world_with_updates.0.zig
@@ -3,3 +3,4 @@
 // target=x86_64-linux
 //
 // :107:9: error: struct 'tmp.tmp' has no member named 'main'
+// :7:1: note: struct declared here
test/cases/x86_64-macos/hello_world_with_updates.0.zig
@@ -3,3 +3,4 @@
 // target=x86_64-macos
 //
 // :107:9: error: struct 'tmp.tmp' has no member named 'main'
+// :7:1: note: struct declared here
test/stage2/cbe.zig
@@ -839,7 +839,7 @@ pub fn addCases(ctx: *TestContext) !void {
             \\    _ = x;
             \\}
         , &.{
-            ":3:17: error: enum 'tmp.E' has no field named 'd'",
+            ":3:17: error: no field named 'd' in enum 'tmp.E'",
             ":1:11: note: enum declared here",
         });
     }