diff --git a/src/Sema.zig b/src/Sema.zig index 72278f550c9b5a03da80589360eda346d50a56b4..ed4ed82a0c9a2d1c09db7a3a4ffa218cbad13110 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -5496,7 +5496,7 @@ fn analyzeCall( // TODO add error note: declared here return sema.fail( block, - func_src, + call_src, "expected {d} argument(s), found {d}", .{ fn_params_len, uncasted_args.len }, ); @@ -21275,7 +21275,7 @@ fn coerceExtra( else => {}, }, .ErrorUnion => switch (inst_ty.zigTypeTag()) { - .ErrorUnion => { + .ErrorUnion => eu: { if (maybe_inst_val) |inst_val| { switch (inst_val.tag()) { .undef => return sema.addConstUndef(dest_ty), @@ -21284,7 +21284,10 @@ fn coerceExtra( inst_ty.errorUnionPayload(), inst_val.castTag(.eu_payload).?.data, ); - return sema.wrapErrorUnionPayload(block, dest_ty, payload, inst_src); + return sema.wrapErrorUnionPayload(block, dest_ty, payload, inst_src) catch |err| switch (err) { + error.NotCoercible => break :eu, + else => |e| return e, + }; }, else => { const error_set = try sema.addConstant( @@ -21303,9 +21306,12 @@ fn coerceExtra( .Undefined => { return sema.addConstUndef(dest_ty); }, - else => { + else => eu: { // T to E!T - return sema.wrapErrorUnionPayload(block, dest_ty, inst, inst_src); + return sema.wrapErrorUnionPayload(block, dest_ty, inst, inst_src) catch |err| switch (err) { + error.NotCoercible => break :eu, + else => |e| return e, + }; }, }, .Union => switch (inst_ty.zigTypeTag()) { @@ -24795,7 +24801,7 @@ fn wrapErrorUnionPayload( inst_src: LazySrcLoc, ) !Air.Inst.Ref { const dest_payload_ty = dest_ty.errorUnionPayload(); - const coerced = try sema.coerce(block, dest_payload_ty, inst, inst_src); + const coerced = try sema.coerceExtra(block, dest_payload_ty, inst, inst_src, false, false); if (try sema.resolveMaybeUndefVal(block, inst_src, coerced)) |val| { return sema.addConstant(dest_ty, try Value.Tag.eu_payload.create(sema.arena, val)); } diff --git a/test/cases/compile_errors/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig b/test/cases/compile_errors/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig new file mode 100644 index 0000000000000000000000000000000000000000..9ae320650ae826178811fb614b7d61292e374474 --- /dev/null +++ b/test/cases/compile_errors/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig @@ -0,0 +1,11 @@ +export fn entry() void { + var foo: u32 = @This(){}; + _ = foo; +} + +// error +// backend=stage2 +// target=native +// +// :2:27: error: expected type 'u32', found 'tmp.tmp' +// :1:1: note: struct declared here diff --git a/test/cases/compile_errors/nested_error_set_mismatch.zig b/test/cases/compile_errors/nested_error_set_mismatch.zig new file mode 100644 index 0000000000000000000000000000000000000000..c0d68a5e5385244faaaf41d3d0bdb3de6b30d4fe --- /dev/null +++ b/test/cases/compile_errors/nested_error_set_mismatch.zig @@ -0,0 +1,19 @@ +const NextError = error{NextError}; +const OtherError = error{OutOfMemory}; + +export fn entry() void { + const a: ?NextError!i32 = foo(); + _ = a; +} + +fn foo() ?OtherError!i32 { + return null; +} + +// error +// backend=llvm +// target=native +// +// :4:1: error: expected type '?error{NextError}!i32', found '?error{OutOfMemory}!i32' +// :4:1: note: optional type child 'error{OutOfMemory}!i32' cannot cast into optional type child 'error{NextError}!i32' +// :4:1: note: 'error.OutOfMemory' not a member of destination error set diff --git a/test/cases/compile_errors/return_invalid_type_from_test.zig b/test/cases/compile_errors/return_invalid_type_from_test.zig index 6cad6af85fbbf45bf9a0fba94de9a6b6c2956d9f..a954bd7ee56932cb72d6b9b2593eefba75acb8fa 100644 --- a/test/cases/compile_errors/return_invalid_type_from_test.zig +++ b/test/cases/compile_errors/return_invalid_type_from_test.zig @@ -5,4 +5,4 @@ test "example" { return 1; } // target=native // is_test=1 // -// :1:25: error: expected type 'void', found 'comptime_int' +// :1:25: error: expected type '@typeInfo(@typeInfo(@TypeOf(tmp.test.example)).Fn.return_type.?).ErrorUnion.error_set!void', found 'comptime_int' \ No newline at end of file diff --git a/test/cases/compile_errors/stage1/obj/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig b/test/cases/compile_errors/stage1/obj/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig deleted file mode 100644 index c742cb9b7756546712193dc0f72db5e307b3ed6a..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig +++ /dev/null @@ -1,10 +0,0 @@ -export fn entry() void { - var foo: u32 = @This(){}; - _ = foo; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:2:27: error: type 'u32' does not support array initialization diff --git a/test/cases/compile_errors/stage1/obj/nested_error_set_mismatch.zig b/test/cases/compile_errors/stage1/obj/nested_error_set_mismatch.zig deleted file mode 100644 index cd037635bc4cc8b5ccd35d8671645be45e8a2695..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/nested_error_set_mismatch.zig +++ /dev/null @@ -1,20 +0,0 @@ -const NextError = error{NextError}; -const OtherError = error{OutOfMemory}; - -export fn entry() void { - const a: ?NextError!i32 = foo(); - _ = a; -} - -fn foo() ?OtherError!i32 { - return null; -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:5:34: error: expected type '?NextError!i32', found '?OtherError!i32' -// tmp.zig:5:34: note: optional type child 'OtherError!i32' cannot cast into optional type child 'NextError!i32' -// tmp.zig:5:34: note: error set 'OtherError' cannot cast into error set 'NextError' -// tmp.zig:2:26: note: 'error.OutOfMemory' not a member of destination error set diff --git a/test/cases/compile_errors/stage1/obj/std.fmt_error_for_unused_arguments.zig b/test/cases/compile_errors/stage1/obj/std.fmt_error_for_unused_arguments.zig deleted file mode 100644 index 21603ab3d314c69482b08fd9c2038ad9d489223f..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/std.fmt_error_for_unused_arguments.zig +++ /dev/null @@ -1,9 +0,0 @@ -export fn entry() void { - @import("std").debug.print("{d} {d} {d} {d} {d}", .{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}); -} - -// error -// backend=stage1 -// target=native -// -// ?:?:?: error: 10 unused arguments in '{d} {d} {d} {d} {d}' diff --git a/test/cases/compile_errors/stage1/obj/wrong_number_of_arguments.zig b/test/cases/compile_errors/stage1/obj/wrong_number_of_arguments.zig deleted file mode 100644 index f25c9dae083d800541c3dec579c466a504fd04cb..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/wrong_number_of_arguments.zig +++ /dev/null @@ -1,10 +0,0 @@ -export fn a() void { - c(1); -} -fn c(d: i32, e: i32, f: i32) void { _ = d; _ = e; _ = f; } - -// error -// backend=stage1 -// target=native -// -// tmp.zig:2:6: error: expected 3 argument(s), found 1 diff --git a/test/cases/compile_errors/stage1/obj/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig b/test/cases/compile_errors/stage1/obj/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig deleted file mode 100644 index b0f484e2fd07868c7d4f11ffa5a1227e611bce46..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig +++ /dev/null @@ -1,10 +0,0 @@ -export fn entry() void { - var x: i32 = 1234; - while (!@cmpxchgWeak(i32, &x, 1234, 5678, @as(u32, 1234), @as(u32, 1234))) {} -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:3:47: error: expected type 'std.builtin.AtomicOrder', found 'u32' diff --git a/test/cases/compile_errors/stage1/obj/wrong_types_given_to_export.zig b/test/cases/compile_errors/stage1/obj/wrong_types_given_to_export.zig deleted file mode 100644 index c06116204f00b04abc3b4b4da4dd941d130f48c4..0000000000000000000000000000000000000000 --- a/test/cases/compile_errors/stage1/obj/wrong_types_given_to_export.zig +++ /dev/null @@ -1,10 +0,0 @@ -fn entry() callconv(.C) void { } -comptime { - @export(entry, .{.name = "entry", .linkage = @as(u32, 1234) }); -} - -// error -// backend=stage1 -// target=native -// -// tmp.zig:3:59: error: expected type 'std.builtin.GlobalLinkage', found 'comptime_int' diff --git a/test/cases/compile_errors/std.fmt_error_for_unused_arguments.zig b/test/cases/compile_errors/std.fmt_error_for_unused_arguments.zig new file mode 100644 index 0000000000000000000000000000000000000000..a20f2798bc8d9682a23d8edfc75b446359c77343 --- /dev/null +++ b/test/cases/compile_errors/std.fmt_error_for_unused_arguments.zig @@ -0,0 +1,9 @@ +export fn entry() void { + @import("std").debug.print("{d} {d} {d} {d} {d}", .{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}); +} + +// error +// backend=llvm +// target=native +// +// :?:?: error: 10 unused arguments in '{d} {d} {d} {d} {d}' diff --git a/test/cases/compile_errors/wrong_number_of_arguments.zig b/test/cases/compile_errors/wrong_number_of_arguments.zig new file mode 100644 index 0000000000000000000000000000000000000000..64eb11650a9c0762021a1b834c4fd2e61ab53078 --- /dev/null +++ b/test/cases/compile_errors/wrong_number_of_arguments.zig @@ -0,0 +1,10 @@ +export fn a() void { + c(1); +} +fn c(d: i32, e: i32, f: i32) void { _ = d; _ = e; _ = f; } + +// error +// backend=stage2 +// target=native +// +// :2:6: error: expected 3 argument(s), found 1 diff --git a/test/cases/compile_errors/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig b/test/cases/compile_errors/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig new file mode 100644 index 0000000000000000000000000000000000000000..f3a4676eb31ea7a4826e3a77a6c6ac66c889b087 --- /dev/null +++ b/test/cases/compile_errors/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig @@ -0,0 +1,11 @@ +export fn entry() void { + var x: i32 = 1234; + while (!@cmpxchgWeak(i32, &x, 1234, 5678, @as(u32, 1234), @as(u32, 1234))) {} +} + +// error +// backend=stage2 +// target=native +// +// :3:47: error: expected type 'builtin.AtomicOrder', found 'u32' +// :?:?: note: enum declared here diff --git a/test/cases/compile_errors/wrong_types_given_to_export.zig b/test/cases/compile_errors/wrong_types_given_to_export.zig new file mode 100644 index 0000000000000000000000000000000000000000..2ae55b4a6317910becb3e398e889850b017141bb --- /dev/null +++ b/test/cases/compile_errors/wrong_types_given_to_export.zig @@ -0,0 +1,11 @@ +fn entry() callconv(.C) void { } +comptime { + @export(entry, .{.name = "entry", .linkage = @as(u32, 1234) }); +} + +// error +// backend=stage2 +// target=native +// +// :3:50: error: expected type 'builtin.GlobalLinkage', found 'u32' +// :?:?: note: enum declared here