aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2023-02-02 14:16:15 +0200
committerVeikka Tuominen <git@vexu.eu>2023-02-11 14:36:54 +0200
commitb9c2837c1c9eddc903aeeb168b8d2daa48837ddb (patch)
tree7ea90436aec6a914cc1f467b8e7dc99250c5c98e /src/Sema.zig
parenta5d25fabdaf7e68f375874b9bda402acaeb9545d (diff)
downloadzig-b9c2837c1c9eddc903aeeb168b8d2daa48837ddb.tar.gz
zig-b9c2837c1c9eddc903aeeb168b8d2daa48837ddb.zip
Sema: validate inferred error set payload type
This was missed in b0a55e1b3be3a274546f9c18016e9609d546bdb0
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig29
1 files changed, 17 insertions, 12 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index b7b3a55063..2dba678931 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -7669,17 +7669,21 @@ fn zirErrorUnionType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr
error_set.fmt(sema.mod),
});
}
- if (payload.zigTypeTag() == .Opaque) {
- return sema.fail(block, rhs_src, "error union with payload of opaque type '{}' not allowed", .{
- payload.fmt(sema.mod),
+ try sema.validateErrorUnionPayloadType(block, payload, rhs_src);
+ const err_union_ty = try Type.errorUnion(sema.arena, error_set, payload, sema.mod);
+ return sema.addType(err_union_ty);
+}
+
+fn validateErrorUnionPayloadType(sema: *Sema, block: *Block, payload_ty: Type, payload_src: LazySrcLoc) !void {
+ if (payload_ty.zigTypeTag() == .Opaque) {
+ return sema.fail(block, payload_src, "error union with payload of opaque type '{}' not allowed", .{
+ payload_ty.fmt(sema.mod),
});
- } else if (payload.zigTypeTag() == .ErrorSet) {
- return sema.fail(block, rhs_src, "error union with payload of error set type '{}' not allowed", .{
- payload.fmt(sema.mod),
+ } else if (payload_ty.zigTypeTag() == .ErrorSet) {
+ return sema.fail(block, payload_src, "error union with payload of error set type '{}' not allowed", .{
+ payload_ty.fmt(sema.mod),
});
}
- const err_union_ty = try Type.errorUnion(sema.arena, error_set, payload, sema.mod);
- return sema.addType(err_union_ty);
}
fn zirErrorValue(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
@@ -8639,6 +8643,7 @@ fn funcCommon(
const return_type = if (!inferred_error_set or ret_poison)
bare_return_type
else blk: {
+ try sema.validateErrorUnionPayloadType(block, bare_return_type, ret_ty_src);
const node = try sema.gpa.create(Module.Fn.InferredErrorSetListNode);
node.data = .{ .func = new_func };
maybe_inferred_error_set_node = node;
@@ -8650,15 +8655,15 @@ fn funcCommon(
});
};
- if (!bare_return_type.isValidReturnType()) {
- const opaque_str = if (bare_return_type.zigTypeTag() == .Opaque) "opaque " else "";
+ if (!return_type.isValidReturnType()) {
+ const opaque_str = if (return_type.zigTypeTag() == .Opaque) "opaque " else "";
const msg = msg: {
const msg = try sema.errMsg(block, ret_ty_src, "{s}return type '{}' not allowed", .{
- opaque_str, bare_return_type.fmt(sema.mod),
+ opaque_str, return_type.fmt(sema.mod),
});
errdefer msg.destroy(sema.gpa);
- try sema.addDeclaredHereNote(msg, bare_return_type);
+ try sema.addDeclaredHereNote(msg, return_type);
break :msg msg;
};
return sema.failWithOwnedErrorMsg(msg);