aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjacob gw <jacoblevgw@gmail.com>2021-04-06 22:38:25 -0400
committerjacob gw <jacoblevgw@gmail.com>2021-04-07 07:19:11 -0400
commit01a39fa1d4d0d2e3305af8e6d6af1079f020db7f (patch)
treef508a38bac37686def18c367c6b3d54c43845297 /src
parent19cf987198ff4de0b1460263a62ff6c41e1e3915 (diff)
downloadzig-01a39fa1d4d0d2e3305af8e6d6af1079f020db7f.tar.gz
zig-01a39fa1d4d0d2e3305af8e6d6af1079f020db7f.zip
stage2: coerce enum_literal -> enum
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 115ca11858..0cd9837c3a 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -4702,6 +4702,60 @@ fn coerce(
}
}
},
+ .Enum => {
+ if (inst.ty.zigTypeTag() == .EnumLiteral) {
+ const val = (try sema.resolveDefinedValue(block, inst_src, inst)).?;
+ const bytes = val.castTag(.enum_literal).?.data;
+ switch (dest_type.tag()) {
+ .enum_full => {
+ const enumeration = dest_type.castTag(.enum_full).?.data;
+ const enum_fields = enumeration.fields;
+ const i = enum_fields.getIndex(bytes) orelse return sema.mod.fail(
+ &block.base,
+ inst_src,
+ "enum '{s}' has no field named '{s}'",
+ .{ enumeration.owner_decl.name, bytes },
+ );
+ const val_pl = try Value.Tag.enum_field_index.create(sema.arena, @intCast(u32, i));
+ return sema.mod.constInst(sema.arena, inst_src, .{
+ .ty = dest_type,
+ .val = val_pl,
+ });
+ },
+ .enum_simple => {
+ const enumeration = dest_type.castTag(.enum_simple).?.data;
+ const enum_fields = enumeration.fields;
+ const i = enum_fields.getIndex(bytes) orelse return sema.mod.fail(
+ &block.base,
+ inst_src,
+ "enum '{s}' has no field named '{s}'",
+ .{ enumeration.owner_decl.name, bytes },
+ );
+ const val_pl = try Value.Tag.enum_field_index.create(sema.arena, @intCast(u32, i));
+ return sema.mod.constInst(sema.arena, inst_src, .{
+ .ty = dest_type,
+ .val = val_pl,
+ });
+ },
+ .enum_nonexhaustive => {
+ const enumeration = dest_type.castTag(.enum_nonexhaustive).?.data;
+ const enum_fields = enumeration.fields;
+ const i = enum_fields.getIndex(bytes) orelse return sema.mod.fail(
+ &block.base,
+ inst_src,
+ "enum '{s}' has no field named '{s}'",
+ .{ enumeration.owner_decl.name, bytes },
+ );
+ const val_pl = try Value.Tag.enum_field_index.create(sema.arena, @intCast(u32, i));
+ return sema.mod.constInst(sema.arena, inst_src, .{
+ .ty = dest_type,
+ .val = val_pl,
+ });
+ },
+ else => unreachable,
+ }
+ }
+ },
else => {},
}