| ... | @@ -21945,7 +21945,21 @@ fn semaStructFields( | ... | @@ -21945,7 +21945,21 @@ fn semaStructFields( |
| 21945 | } | 21945 | } |
| 21946 | | 21946 | |
| 21947 | const gop = struct_obj.fields.getOrPutAssumeCapacity(field_name); | 21947 | const gop = struct_obj.fields.getOrPutAssumeCapacity(field_name); |
| 21948 | assert(!gop.found_existing); | 21948 | if (gop.found_existing) { |
| | 21949 | const msg = msg: { |
| | 21950 | const tree = try sema.getAstTree(&block_scope); |
| | 21951 | const field_src = enumFieldSrcLoc(decl, tree.*, struct_obj.node_offset, field_i); |
| | 21952 | const msg = try sema.errMsg(&block_scope, field_src, "duplicate struct field: '{s}'", .{field_name}); |
| | 21953 | errdefer msg.destroy(gpa); |
| | 21954 | |
| | 21955 | const prev_field_index = struct_obj.fields.getIndex(field_name).?; |
| | 21956 | const prev_field_src = enumFieldSrcLoc(decl, tree.*, struct_obj.node_offset, prev_field_index); |
| | 21957 | try sema.mod.errNoteNonLazy(prev_field_src.toSrcLoc(decl), msg, "other field here", .{}); |
| | 21958 | try sema.errNote(&block_scope, src, msg, "struct declared here", .{}); |
| | 21959 | break :msg msg; |
| | 21960 | }; |
| | 21961 | return sema.failWithOwnedErrorMsg(&block_scope, msg); |
| | 21962 | } |
| 21949 | gop.value_ptr.* = .{ | 21963 | gop.value_ptr.* = .{ |
| 21950 | .ty = try field_ty.copy(decl_arena_allocator), | 21964 | .ty = try field_ty.copy(decl_arena_allocator), |
| 21951 | .abi_align = 0, | 21965 | .abi_align = 0, |