aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-10-05 23:05:14 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-10-05 23:05:14 -0700
commite16ddad49f1b3e4ce10ce8fb653e48f24a9d4837 (patch)
tree131a0873355fecce3c1abac1d0f42b8cab27d515 /src/value.zig
parentcb616cb7972bb2f38ea4527c7ec0ae3cc0d64c7c (diff)
downloadzig-e16ddad49f1b3e4ce10ce8fb653e48f24a9d4837.tar.gz
zig-e16ddad49f1b3e4ce10ce8fb653e48f24a9d4837.zip
stage2: enum fixes
* Sema: fix a missing copy on enum tag values * LLVM backend: fix lowering of enum constant values for enums with specified tag values. * Value: fix enumToInt for `enum_numbered` cases. The float widening behavior tests which rely on compiler-rt symbols are now passing.
Diffstat (limited to 'src/value.zig')
-rw-r--r--src/value.zig13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/value.zig b/src/value.zig
index 90d98bd539..4e8c79c93b 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -858,6 +858,19 @@ pub const Value = extern union {
return Value.initPayload(&buffer.base);
}
},
+ .enum_numbered => {
+ const enum_obj = ty.castTag(.enum_numbered).?.data;
+ if (enum_obj.values.count() != 0) {
+ return enum_obj.values.keys()[field_index];
+ } else {
+ // Field index and integer values are the same.
+ buffer.* = .{
+ .base = .{ .tag = .int_u64 },
+ .data = field_index,
+ };
+ return Value.initPayload(&buffer.base);
+ }
+ },
.enum_simple => {
// Field index and integer values are the same.
buffer.* = .{