diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-07-26 15:39:47 +0300 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-07-26 23:29:54 +0300 |
| commit | d6e3988fe846864a33adf9f5f04d800718b31392 (patch) | |
| tree | e6678d0b0cc5c51f75112e19191de6d56dbe1914 /src | |
| parent | 7862ab9f410d20d0cfe799bf025f8cf57dd6f15a (diff) | |
| download | zig-d6e3988fe846864a33adf9f5f04d800718b31392.tar.gz zig-d6e3988fe846864a33adf9f5f04d800718b31392.zip | |
Sema: better error when coercing error sets
Diffstat (limited to 'src')
| -rw-r--r-- | src/Sema.zig | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 72278f550c..ed4ed82a0c 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)); } |
