From cb616cb7972bb2f38ea4527c7ec0ae3cc0d64c7c Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 5 Oct 2021 21:38:47 -0700 Subject: stage2: implement runtime `@intToEnum` * Update AIR instruction `intcast` to allow the dest type to be an enum. * LLVM backend: update `intcast` to support when the bit counts of operand and dest type are the same. This was already a requirement of the instruction previously. * Type: `intInfo` supports the case when the type is an enum, and retrieves the info for the integer tag type. This makes it pretty easy for backends to implement `intcast` without having to care explicitly that the new type is an enum. As a bonus, simple enums never have to go through the type system; their signedness and bit count are computed directly. The "int to enum" behavior test case is now passing for stage2 in the LLVM backend. --- test/behavior/enum.zig | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'test/behavior/enum.zig') diff --git a/test/behavior/enum.zig b/test/behavior/enum.zig index bd47481b5f..684115b992 100644 --- a/test/behavior/enum.zig +++ b/test/behavior/enum.zig @@ -17,6 +17,15 @@ test "enum to int" { try shouldEqual(Number.Four, 4); } +fn testIntToEnumEval(x: i32) !void { + try expect(@intToEnum(IntToEnumNumber, x) == IntToEnumNumber.Three); +} +const IntToEnumNumber = enum { Zero, One, Two, Three, Four }; + +test "int to enum" { + try testIntToEnumEval(3); +} + const ValueCount1 = enum { I0, }; -- cgit v1.2.3