aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-06-30 16:10:15 +0300
committerVeikka Tuominen <git@vexu.eu>2022-07-01 09:29:13 +0300
commit6d24c40b6e79176b05ec735adcecfd346b03f059 (patch)
tree26c5240abbadf123a98c0077b4521e9c61a4c2fc /src/Sema.zig
parent902dc8c721c762bc5d1b9786bad47b21da45042c (diff)
downloadzig-6d24c40b6e79176b05ec735adcecfd346b03f059.tar.gz
zig-6d24c40b6e79176b05ec735adcecfd346b03f059.zip
Sema: improve bitcast to enum error
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 862d5cbf48..08372bf7b3 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -7617,11 +7617,11 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
const dest_ty = try sema.resolveType(block, dest_ty_src, extra.lhs);
+ const operand = try sema.resolveInst(extra.rhs);
switch (dest_ty.zigTypeTag()) {
.AnyFrame,
.ComptimeFloat,
.ComptimeInt,
- .Enum,
.EnumLiteral,
.ErrorSet,
.ErrorUnion,
@@ -7634,7 +7634,21 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
.Type,
.Undefined,
.Void,
- => return sema.fail(block, dest_ty_src, "invalid type '{}' for @bitCast", .{dest_ty.fmt(sema.mod)}),
+ => return sema.fail(block, dest_ty_src, "cannot @bitCast to '{}'", .{dest_ty.fmt(sema.mod)}),
+
+ .Enum => {
+ const msg = msg: {
+ const msg = try sema.errMsg(block, dest_ty_src, "cannot @bitCast to '{}'", .{dest_ty.fmt(sema.mod)});
+ errdefer msg.destroy(sema.gpa);
+ switch (sema.typeOf(operand).zigTypeTag()) {
+ .Int, .ComptimeInt => try sema.errNote(block, dest_ty_src, msg, "use @intToEnum for type coercion", .{}),
+ else => {},
+ }
+
+ break :msg msg;
+ };
+ return sema.failWithOwnedErrorMsg(block, msg);
+ },
.Pointer => return sema.fail(block, dest_ty_src, "cannot @bitCast to '{}', use @ptrCast to cast to a pointer", .{
dest_ty.fmt(sema.mod),
@@ -7658,8 +7672,6 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
.Vector,
=> {},
}
-
- const operand = try sema.resolveInst(extra.rhs);
return sema.bitCast(block, dest_ty, operand, operand_src);
}