From d6e3988fe846864a33adf9f5f04d800718b31392 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Tue, 26 Jul 2022 15:39:47 +0300 Subject: [PATCH] Sema: better error when coercing error sets --- src/Sema.zig | 18 +++++++++++------ ...gnostic_string_for_top_level_decl_type.zig | 11 ++++++++++ .../nested_error_set_mismatch.zig | 19 ++++++++++++++++++ .../return_invalid_type_from_test.zig | 2 +- ...gnostic_string_for_top_level_decl_type.zig | 10 ---------- .../stage1/obj/nested_error_set_mismatch.zig | 20 ------------------- .../std.fmt_error_for_unused_arguments.zig | 4 ++-- .../obj => }/wrong_number_of_arguments.zig | 4 ++-- ..._given_to_atomic_order_args_in_cmpxchg.zig | 5 +++-- .../obj => }/wrong_types_given_to_export.zig | 5 +++-- 10 files changed, 53 insertions(+), 45 deletions(-) create mode 100644 test/cases/compile_errors/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig create mode 100644 test/cases/compile_errors/nested_error_set_mismatch.zig delete mode 100644 test/cases/compile_errors/stage1/obj/issue_2032_compile_diagnostic_string_for_top_level_decl_type.zig delete mode 100644 test/cases/compile_errors/stage1/obj/nested_error_set_mismatch.zig rename test/cases/compile_errors/{stage1/obj => }/std.fmt_error_for_unused_arguments.zig (65%) rename test/cases/compile_errors/{stage1/obj => }/wrong_number_of_arguments.zig (62%) rename test/cases/compile_errors/{stage1/obj => }/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig (57%) rename test/cases/compile_errors/{stage1/obj => }/wrong_types_given_to_export.zig (54%) 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/std.fmt_error_for_unused_arguments.zig similarity index 65% rename from test/cases/compile_errors/stage1/obj/std.fmt_error_for_unused_arguments.zig rename to test/cases/compile_errors/std.fmt_error_for_unused_arguments.zig index 21603ab3d314c69482b08fd9c2038ad9d489223f..a20f2798bc8d9682a23d8edfc75b446359c77343 100644 --- a/test/cases/compile_errors/stage1/obj/std.fmt_error_for_unused_arguments.zig +++ b/test/cases/compile_errors/std.fmt_error_for_unused_arguments.zig @@ -3,7 +3,7 @@ export fn entry() void { } // error -// backend=stage1 +// backend=llvm // target=native // -// ?:?:?: error: 10 unused arguments in '{d} {d} {d} {d} {d}' +// :?:?: 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/wrong_number_of_arguments.zig similarity index 62% rename from test/cases/compile_errors/stage1/obj/wrong_number_of_arguments.zig rename to test/cases/compile_errors/wrong_number_of_arguments.zig index f25c9dae083d800541c3dec579c466a504fd04cb..64eb11650a9c0762021a1b834c4fd2e61ab53078 100644 --- a/test/cases/compile_errors/stage1/obj/wrong_number_of_arguments.zig +++ b/test/cases/compile_errors/wrong_number_of_arguments.zig @@ -4,7 +4,7 @@ export fn a() void { fn c(d: i32, e: i32, f: i32) void { _ = d; _ = e; _ = f; } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:2:6: error: expected 3 argument(s), found 1 +// :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/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig similarity index 57% rename from test/cases/compile_errors/stage1/obj/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig rename to test/cases/compile_errors/wrong_types_given_to_atomic_order_args_in_cmpxchg.zig index b0f484e2fd07868c7d4f11ffa5a1227e611bce46..f3a4676eb31ea7a4826e3a77a6c6ac66c889b087 100644 --- a/test/cases/compile_errors/stage1/obj/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 @@ -4,7 +4,8 @@ export fn entry() void { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:3:47: error: expected type 'std.builtin.AtomicOrder', found 'u32' +// :3:47: error: expected type 'builtin.AtomicOrder', found 'u32' +// :?:?: note: enum declared here diff --git a/test/cases/compile_errors/stage1/obj/wrong_types_given_to_export.zig b/test/cases/compile_errors/wrong_types_given_to_export.zig similarity index 54% rename from test/cases/compile_errors/stage1/obj/wrong_types_given_to_export.zig rename to test/cases/compile_errors/wrong_types_given_to_export.zig index c06116204f00b04abc3b4b4da4dd941d130f48c4..2ae55b4a6317910becb3e398e889850b017141bb 100644 --- a/test/cases/compile_errors/stage1/obj/wrong_types_given_to_export.zig +++ b/test/cases/compile_errors/wrong_types_given_to_export.zig @@ -4,7 +4,8 @@ comptime { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:3:59: error: expected type 'std.builtin.GlobalLinkage', found 'comptime_int' +// :3:50: error: expected type 'builtin.GlobalLinkage', found 'u32' +// :?:?: note: enum declared here -- 2.54.0