commit 96a5f7c8edac4bb2f50bdfe31c1287207d90d29b (tree)
parent c085c6ecdd4b9436955ba2bb38f829100ed9b33d
Author: Pavel Verigo <paul.verigo@gmail.com>
Date: Sun, 28 Jan 2024 17:15:33 +0100
Sema: fix casting runtime value to enum with comptime int tag type
Diffstat:
2 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/src/Sema.zig b/src/Sema.zig
@@ -8657,6 +8657,12 @@ fn zirEnumFromInt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
return Air.internedToRef((try mod.getCoerced(int_val, dest_ty)).toIntern());
}
+ if (dest_ty.intTagType(mod).zigTypeTag(mod) == .ComptimeInt) {
+ return sema.failWithNeededComptime(block, operand_src, .{
+ .needed_comptime_reason = "value being casted to enum with 'comptime_int' tag type must be comptime-known",
+ });
+ }
+
if (try sema.typeHasOnePossibleValue(dest_ty)) |opv| {
const result = Air.internedToRef(opv.toIntern());
// The operand is runtime-known but the result is comptime-known. In
diff --git a/test/cases/compile_errors/enum_backed_by_comptime_int_must_be_casted_from_comptime_value.zig b/test/cases/compile_errors/enum_backed_by_comptime_int_must_be_casted_from_comptime_value.zig
@@ -0,0 +1,14 @@
+export fn entry() void {
+ const Tag = enum(comptime_int) { a, b };
+
+ var v: u32 = 0;
+ _ = &v;
+ _ = @as(Tag, @enumFromInt(v));
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :6:31: error: unable to resolve comptime value
+// :6:31: note: value being casted to enum with 'comptime_int' tag type must be comptime-known