diff options
| author | jacob gw <jacoblevgw@gmail.com> | 2021-04-06 22:38:25 -0400 |
|---|---|---|
| committer | jacob gw <jacoblevgw@gmail.com> | 2021-04-07 07:19:11 -0400 |
| commit | 01a39fa1d4d0d2e3305af8e6d6af1079f020db7f (patch) | |
| tree | f508a38bac37686def18c367c6b3d54c43845297 /src | |
| parent | 19cf987198ff4de0b1460263a62ff6c41e1e3915 (diff) | |
| download | zig-01a39fa1d4d0d2e3305af8e6d6af1079f020db7f.tar.gz zig-01a39fa1d4d0d2e3305af8e6d6af1079f020db7f.zip | |
stage2: coerce enum_literal -> enum
Diffstat (limited to 'src')
| -rw-r--r-- | src/Sema.zig | 54 |
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 => {}, } |
