aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-07-26 15:39:47 +0300
committerVeikka Tuominen <git@vexu.eu>2022-07-26 23:29:54 +0300
commitd6e3988fe846864a33adf9f5f04d800718b31392 (patch)
treee6678d0b0cc5c51f75112e19191de6d56dbe1914 /src/Sema.zig
parent7862ab9f410d20d0cfe799bf025f8cf57dd6f15a (diff)
downloadzig-d6e3988fe846864a33adf9f5f04d800718b31392.tar.gz
zig-d6e3988fe846864a33adf9f5f04d800718b31392.zip
Sema: better error when coercing error sets
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig18
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));
}