| ... | @@ -18264,9 +18264,9 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in | ... | @@ -18264,9 +18264,9 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in |
| 18264 | .mod = mod, | 18264 | .mod = mod, |
| 18265 | }); | 18265 | }); |
| 18266 | | 18266 | |
| 18267 | var i: usize = 0; | 18267 | var field_i: usize = 0; |
| 18268 | while (i < fields_len) : (i += 1) { | 18268 | while (field_i < fields_len) : (field_i += 1) { |
| 18269 | const elem_val = try fields_val.elemValue(sema.mod, sema.arena, i); | 18269 | const elem_val = try fields_val.elemValue(sema.mod, sema.arena, field_i); |
| 18270 | const field_struct_val: []const Value = elem_val.castTag(.aggregate).?.data; | 18270 | const field_struct_val: []const Value = elem_val.castTag(.aggregate).?.data; |
| 18271 | // TODO use reflection instead of magic numbers here | 18271 | // TODO use reflection instead of magic numbers here |
| 18272 | // name: []const u8 | 18272 | // name: []const u8 |
| ... | @@ -18289,17 +18289,31 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in | ... | @@ -18289,17 +18289,31 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in |
| 18289 | }); | 18289 | }); |
| 18290 | } | 18290 | } |
| 18291 | | 18291 | |
| 18292 | const gop = enum_obj.fields.getOrPutAssumeCapacity(field_name); | 18292 | const gop_field = enum_obj.fields.getOrPutAssumeCapacity(field_name); |
| 18293 | if (gop.found_existing) { | 18293 | if (gop_field.found_existing) { |
| 18294 | // TODO: better source location | 18294 | const msg = msg: { |
| 18295 | return sema.fail(block, src, "duplicate enum tag {s}", .{field_name}); | 18295 | const msg = try sema.errMsg(block, src, "duplicate enum field '{s}'", .{field_name}); |
| | 18296 | errdefer msg.destroy(gpa); |
| | 18297 | try sema.errNote(block, src, msg, "other field here", .{}); |
| | 18298 | break :msg msg; |
| | 18299 | }; |
| | 18300 | return sema.failWithOwnedErrorMsg(msg); |
| 18296 | } | 18301 | } |
| 18297 | | 18302 | |
| 18298 | const copied_tag_val = try value_val.copy(new_decl_arena_allocator); | 18303 | const copied_tag_val = try value_val.copy(new_decl_arena_allocator); |
| 18299 | enum_obj.values.putAssumeCapacityNoClobberContext(copied_tag_val, {}, .{ | 18304 | const gop_val = enum_obj.values.getOrPutAssumeCapacityContext(copied_tag_val, .{ |
| 18300 | .ty = enum_obj.tag_ty, | 18305 | .ty = enum_obj.tag_ty, |
| 18301 | .mod = mod, | 18306 | .mod = mod, |
| 18302 | }); | 18307 | }); |
| | 18308 | if (gop_val.found_existing) { |
| | 18309 | const msg = msg: { |
| | 18310 | const msg = try sema.errMsg(block, src, "enum tag value {} already taken", .{value_val.fmtValue(Type.comptime_int, mod)}); |
| | 18311 | errdefer msg.destroy(gpa); |
| | 18312 | try sema.errNote(block, src, msg, "other enum tag value here", .{}); |
| | 18313 | break :msg msg; |
| | 18314 | }; |
| | 18315 | return sema.failWithOwnedErrorMsg(msg); |
| | 18316 | } |
| 18303 | } | 18317 | } |
| 18304 | | 18318 | |
| 18305 | try new_decl.finalizeNewArena(&new_decl_arena); | 18319 | try new_decl.finalizeNewArena(&new_decl_arena); |