authorgravatar for john.schmidt.h@gmail.comJohn Schmidt <john.schmidt.h@gmail.com> 2022-04-03 14:07:13+02:00
committergravatar for john.schmidt.h@gmail.comJohn Schmidt <john.schmidt.h@gmail.com> 2022-04-03 14:30:32+02:00
log6bbc2cd59af250ea164a4114e3d9fa15b27c2c8e
tree13714a34d95b4e216337b6496b08aff3ef93770c
parent174a889364d285e32534016f7425e8adaf9cab3c

sema: add compile error for duplicate struct field


2 files changed, 30 insertions(+), 1 deletions(-)

src/Sema.zig+15-1
...@@ -21945,7 +21945,21 @@ fn semaStructFields(...@@ -21945,7 +21945,21 @@ fn semaStructFields(
21945 }21945 }
2194621946
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,
test/compile_errors/stage2/struct_duplicate_field_name.zig created+15
...@@ -0,0 +1,15 @@
1const S = struct {
2 foo: u32,
3 foo: u32,
4};
5
6export fn entry() void {
7 const s: S = .{ .foo = 100 };
8 _ = s;
9}
10
11// duplicate struct field name
12//
13// :3:5: error: duplicate struct field: 'foo'
14// :2:5: note: other field here
15// :1:11: note: struct declared here