diff --git a/src/Sema.zig b/src/Sema.zig index 64db6a9bed..5010d86c9a 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -8378,19 +8378,15 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError block, src, msg, - "unhandled error value: error.{s}", + "unhandled error value: 'error.{s}'", .{error_name}, ); } } if (maybe_msg) |msg| { - try sema.mod.errNoteNonLazy( - operand_ty.declSrcLoc(sema.mod), - msg, - "error set '{}' declared here", - .{operand_ty.fmt(sema.mod)}, - ); + maybe_msg = null; + try sema.addDeclaredHereNote(msg, operand_ty); return sema.failWithOwnedErrorMsg(block, msg); } @@ -17143,9 +17139,7 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr const field_index = struct_obj.fields.getIndex(field_name) orelse return sema.failWithBadStructFieldAccess(block, struct_obj, name_src, field_name); - if (field_ptr_ty.zigTypeTag() != .Pointer) { - return sema.fail(block, ty_src, "expected pointer type, found '{}'", .{field_ptr_ty.fmt(sema.mod)}); - } + try sema.checkPtrOperand(block, ptr_src, field_ptr_ty); const field = struct_obj.fields.values()[field_index]; const field_ptr_ty_info = field_ptr_ty.ptrInfo().data; @@ -17168,8 +17162,29 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr const result_ptr = try Type.ptr(sema.arena, sema.mod, ptr_ty_data); if (try sema.resolveDefinedValue(block, src, casted_field_ptr)) |field_ptr_val| { - const payload = field_ptr_val.castTag(.field_ptr).?.data; - return sema.addConstant(result_ptr, payload.container_ptr); + const payload = field_ptr_val.castTag(.field_ptr) orelse { + return sema.fail(block, ptr_src, "pointer value not based on parent struct", .{}); + }; + if (payload.data.field_index != field_index) { + const msg = msg: { + const msg = try sema.errMsg( + block, + src, + "field '{s}' has index '{d}' but pointer value is index '{d}' of struct '{}'", + .{ + field_name, + field_index, + payload.data.field_index, + struct_ty.fmt(sema.mod), + }, + ); + errdefer msg.destroy(sema.gpa); + try sema.addDeclaredHereNote(msg, struct_ty); + break :msg msg; + }; + return sema.failWithOwnedErrorMsg(block, msg); + } + return sema.addConstant(result_ptr, payload.data.container_ptr); } try sema.requireRuntimeBlock(block, src); @@ -18515,7 +18530,16 @@ fn fieldVal( kw_name, child_type.fmt(sema.mod), field_name, }); }, - else => return sema.fail(block, src, "type '{}' has no members", .{child_type.fmt(sema.mod)}), + else => { + const msg = msg: { + const msg = try sema.errMsg(block, src, "type '{}' has no members", .{child_type.fmt(sema.mod)}); + errdefer msg.destroy(sema.gpa); + if (child_type.isSlice()) try sema.errNote(block, src, msg, "slice values have 'len' and 'ptr' members", .{}); + if (child_type.zigTypeTag() == .Array) try sema.errNote(block, src, msg, "array values have 'len' member", .{}); + break :msg msg; + }; + return sema.failWithOwnedErrorMsg(block, msg); + }, } }, .Struct => if (is_pointer_to) { @@ -18739,7 +18763,7 @@ fn fieldPtr( }, else => {}, } - return sema.fail(block, src, "type '{}' does not support field access (fieldPtr, {}.{s})", .{ object_ty.fmt(sema.mod), object_ptr_ty.fmt(sema.mod), field_name }); + return sema.fail(block, src, "type '{}' does not support field access", .{object_ty.fmt(sema.mod)}); } fn fieldCallBind( diff --git a/test/cases/compile_errors/stage1/obj/division_by_zero.zig b/test/cases/compile_errors/division_by_zero.zig similarity index 55% rename from test/cases/compile_errors/stage1/obj/division_by_zero.zig rename to test/cases/compile_errors/division_by_zero.zig index 3023f0c6f3..2e2f7e2be2 100644 --- a/test/cases/compile_errors/stage1/obj/division_by_zero.zig +++ b/test/cases/compile_errors/division_by_zero.zig @@ -6,13 +6,12 @@ const float_x = @as(f32, 1.0) / @as(f32, 0.0); export fn entry1() usize { return @sizeOf(@TypeOf(lit_int_x)); } export fn entry2() usize { return @sizeOf(@TypeOf(lit_float_x)); } export fn entry3() usize { return @sizeOf(@TypeOf(int_x)); } -export fn entry4() usize { return @sizeOf(@TypeOf(float_x)); } +export fn entry4() usize { return @sizeOf(@TypeOf(float_x)); } // no error on purpose // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:1:21: error: division by zero -// tmp.zig:2:25: error: division by zero -// tmp.zig:3:27: error: division by zero -// tmp.zig:4:31: error: division by zero +// :1:23: error: division by zero here causes undefined behavior +// :2:27: error: division by zero here causes undefined behavior +// :3:29: error: division by zero here causes undefined behavior diff --git a/test/cases/compile_errors/stage1/obj/error_not_handled_in_switch.zig b/test/cases/compile_errors/error_not_handled_in_switch.zig similarity index 64% rename from test/cases/compile_errors/stage1/obj/error_not_handled_in_switch.zig rename to test/cases/compile_errors/error_not_handled_in_switch.zig index 12ee35daef..8f0d26a4a9 100644 --- a/test/cases/compile_errors/stage1/obj/error_not_handled_in_switch.zig +++ b/test/cases/compile_errors/error_not_handled_in_switch.zig @@ -13,8 +13,9 @@ fn foo(x: i32) !void { } // error -// backend=stage1 +// backend=llvm // target=native // -// tmp.zig:2:26: error: error.Baz not handled in switch -// tmp.zig:2:26: error: error.Bar not handled in switch +// :2:26: error: switch must handle all possibilities +// :2:26: note: unhandled error value: 'error.Bar' +// :2:26: note: unhandled error value: 'error.Baz' diff --git a/test/cases/compile_errors/stage1/obj/fieldParentPtr-comptime_field_ptr_not_based_on_struct.zig b/test/cases/compile_errors/fieldParentPtr-comptime_field_ptr_not_based_on_struct.zig similarity index 76% rename from test/cases/compile_errors/stage1/obj/fieldParentPtr-comptime_field_ptr_not_based_on_struct.zig rename to test/cases/compile_errors/fieldParentPtr-comptime_field_ptr_not_based_on_struct.zig index 9375f4639a..7f57268f06 100644 --- a/test/cases/compile_errors/stage1/obj/fieldParentPtr-comptime_field_ptr_not_based_on_struct.zig +++ b/test/cases/compile_errors/fieldParentPtr-comptime_field_ptr_not_based_on_struct.zig @@ -11,7 +11,7 @@ comptime { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:9:55: error: pointer value not based on parent struct +// :9:55: error: pointer value not based on parent struct diff --git a/test/cases/compile_errors/stage1/obj/fieldParentPtr-comptime_wrong_field_index.zig b/test/cases/compile_errors/fieldParentPtr-comptime_wrong_field_index.zig similarity index 59% rename from test/cases/compile_errors/stage1/obj/fieldParentPtr-comptime_wrong_field_index.zig rename to test/cases/compile_errors/fieldParentPtr-comptime_wrong_field_index.zig index c322543dc0..a73409aea3 100644 --- a/test/cases/compile_errors/stage1/obj/fieldParentPtr-comptime_wrong_field_index.zig +++ b/test/cases/compile_errors/fieldParentPtr-comptime_wrong_field_index.zig @@ -10,7 +10,8 @@ comptime { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:8:29: error: field 'b' has index 1 but pointer value is index 0 of struct 'Foo' +// :8:29: error: field 'b' has index '1' but pointer value is index '0' of struct 'tmp.Foo' +// :1:13: note: struct declared here diff --git a/test/cases/compile_errors/stage1/obj/fieldParentPtr-field_pointer_is_not_pointer.zig b/test/cases/compile_errors/fieldParentPtr-field_pointer_is_not_pointer.zig similarity index 66% rename from test/cases/compile_errors/stage1/obj/fieldParentPtr-field_pointer_is_not_pointer.zig rename to test/cases/compile_errors/fieldParentPtr-field_pointer_is_not_pointer.zig index 71360e5681..8a57d08c3b 100644 --- a/test/cases/compile_errors/stage1/obj/fieldParentPtr-field_pointer_is_not_pointer.zig +++ b/test/cases/compile_errors/fieldParentPtr-field_pointer_is_not_pointer.zig @@ -6,7 +6,7 @@ export fn foo(a: i32) *Foo { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:5:38: error: expected pointer, found 'i32' +// :5:38: error: expected pointer type, found 'i32' diff --git a/test/cases/compile_errors/stage1/obj/field_access_of_opaque_type.zig b/test/cases/compile_errors/field_access_of_opaque_type.zig similarity index 68% rename from test/cases/compile_errors/stage1/obj/field_access_of_opaque_type.zig rename to test/cases/compile_errors/field_access_of_opaque_type.zig index 963c89dafe..f9ec483305 100644 --- a/test/cases/compile_errors/stage1/obj/field_access_of_opaque_type.zig +++ b/test/cases/compile_errors/field_access_of_opaque_type.zig @@ -10,7 +10,7 @@ fn bar(x: *MyType) bool { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:9:13: error: no member named 'blah' in opaque type 'MyType' +// :9:13: error: type '*tmp.MyType' does not support field access diff --git a/test/cases/compile_errors/stage1/obj/field_access_of_slices.zig b/test/cases/compile_errors/field_access_of_slices.zig similarity index 54% rename from test/cases/compile_errors/stage1/obj/field_access_of_slices.zig rename to test/cases/compile_errors/field_access_of_slices.zig index 45ca711367..1fbfda9646 100644 --- a/test/cases/compile_errors/stage1/obj/field_access_of_slices.zig +++ b/test/cases/compile_errors/field_access_of_slices.zig @@ -5,7 +5,8 @@ export fn entry() void { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:3:32: error: type 'type' does not support field access +// :3:32: error: type '[]i32' has no members +// :3:32: note: slice values have 'len' and 'ptr' members diff --git a/test/cases/compile_errors/stage1/obj/field_access_of_unknown_length_pointer.zig b/test/cases/compile_errors/field_access_of_unknown_length_pointer.zig similarity index 60% rename from test/cases/compile_errors/stage1/obj/field_access_of_unknown_length_pointer.zig rename to test/cases/compile_errors/field_access_of_unknown_length_pointer.zig index f9a37cabcc..2f526277fe 100644 --- a/test/cases/compile_errors/stage1/obj/field_access_of_unknown_length_pointer.zig +++ b/test/cases/compile_errors/field_access_of_unknown_length_pointer.zig @@ -7,7 +7,7 @@ export fn entry(foo: [*]Foo) void { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:6:8: error: type '[*]Foo' does not support field access +// :6:8: error: type '[*]tmp.Foo' does not support field access diff --git a/test/cases/compile_errors/stage1/obj/error_equality_but_sets_have_no_common_members.zig b/test/cases/compile_errors/stage1/error_equality_but_sets_have_no_common_members.zig similarity index 100% rename from test/cases/compile_errors/stage1/obj/error_equality_but_sets_have_no_common_members.zig rename to test/cases/compile_errors/stage1/error_equality_but_sets_have_no_common_members.zig