| ... | @@ -17092,7 +17092,7 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in | ... | @@ -17092,7 +17092,7 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in |
| 17092 | try sema.reifyStruct(block, inst, src, layout, backing_int_val, fields_val, name_strategy); | 17092 | try sema.reifyStruct(block, inst, src, layout, backing_int_val, fields_val, name_strategy); |
| 17093 | }, | 17093 | }, |
| 17094 | .Enum => { | 17094 | .Enum => { |
| 17095 | const struct_val = union_val.val.castTag(.aggregate).?.data; | 17095 | const struct_val: []const Value = union_val.val.castTag(.aggregate).?.data; |
| 17096 | // TODO use reflection instead of magic numbers here | 17096 | // TODO use reflection instead of magic numbers here |
| 17097 | // layout: ContainerLayout, | 17097 | // layout: ContainerLayout, |
| 17098 | const layout_val = struct_val[0]; | 17098 | const layout_val = struct_val[0]; |
| ... | @@ -17176,7 +17176,7 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in | ... | @@ -17176,7 +17176,7 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in |
| 17176 | var i: usize = 0; | 17176 | var i: usize = 0; |
| 17177 | while (i < fields_len) : (i += 1) { | 17177 | while (i < fields_len) : (i += 1) { |
| 17178 | const elem_val = try fields_val.elemValue(sema.mod, sema.arena, i); | 17178 | const elem_val = try fields_val.elemValue(sema.mod, sema.arena, i); |
| 17179 | const field_struct_val = elem_val.castTag(.aggregate).?.data; | 17179 | const field_struct_val: []const Value = elem_val.castTag(.aggregate).?.data; |
| 17180 | // TODO use reflection instead of magic numbers here | 17180 | // TODO use reflection instead of magic numbers here |
| 17181 | // name: []const u8 | 17181 | // name: []const u8 |
| 17182 | const name_val = field_struct_val[0]; | 17182 | const name_val = field_struct_val[0]; |
| ... | @@ -17189,6 +17189,15 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in | ... | @@ -17189,6 +17189,15 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in |
| 17189 | sema.mod, | 17189 | sema.mod, |
| 17190 | ); | 17190 | ); |
| 17191 | | 17191 | |
| | 17192 | if (!try sema.intFitsInType(block, src, value_val, enum_obj.tag_ty, null)) { |
| | 17193 | // TODO: better source location |
| | 17194 | return sema.fail(block, src, "field '{s}' with enumeration value '{}' is too large for backing int type '{}'", .{ |
| | 17195 | field_name, |
| | 17196 | value_val.fmtValue(Type.@"comptime_int", mod), |
| | 17197 | enum_obj.tag_ty.fmt(mod), |
| | 17198 | }); |
| | 17199 | } |
| | 17200 | |
| 17192 | const gop = enum_obj.fields.getOrPutAssumeCapacity(field_name); | 17201 | const gop = enum_obj.fields.getOrPutAssumeCapacity(field_name); |
| 17193 | if (gop.found_existing) { | 17202 | if (gop.found_existing) { |
| 17194 | // TODO: better source location | 17203 | // TODO: better source location |