diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index 5dc41cc9d2c6..c67be7db8263 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -5360,8 +5360,6 @@ fn tupleDecl( const gpa = astgen.gpa; const tree = astgen.tree; - const node_tags = tree.nodes.items(.tag); - switch (layout) { .auto => {}, .@"extern", .@"packed" => return astgen.failNode(node, "{s} tuples are not supported", .{@tagName(layout)}), @@ -5383,12 +5381,9 @@ fn tupleDecl( for (container_decl.ast.members) |member_node| { const field = tree.fullContainerField(member_node) orelse { - const tuple_member = for (container_decl.ast.members) |maybe_tuple| switch (node_tags[maybe_tuple]) { - .container_field_init, - .container_field_align, - .container_field, - => break maybe_tuple, - else => {}, + const tuple_member = for (container_decl.ast.members) |maybe_tuple| { + if ((tree.fullContainerField(maybe_tuple) orelse continue).ast.tuple_like) + break maybe_tuple; } else unreachable; return astgen.failNodeNotes( member_node, @@ -5399,7 +5394,16 @@ fn tupleDecl( }; if (!field.ast.tuple_like) { - return astgen.failTok(field.ast.main_token, "tuple field has a name", .{}); + const tuple_member = for (container_decl.ast.members) |maybe_tuple| { + if ((tree.fullContainerField(maybe_tuple) orelse continue).ast.tuple_like) + break maybe_tuple; + } else unreachable; + return astgen.failTokNotes( + field.ast.main_token, + "tuple field has a name", + .{}, + &.{try astgen.errNoteNode(tuple_member, "tuple field here", .{})}, + ); } if (field.ast.align_expr != 0) { diff --git a/test/cases/compile_errors/tuple_declarations.zig b/test/cases/compile_errors/tuple_declarations.zig index 9a181e9769e6..51f4b1a8b01c 100644 --- a/test/cases/compile_errors/tuple_declarations.zig +++ b/test/cases/compile_errors/tuple_declarations.zig @@ -15,6 +15,13 @@ const T = struct { const a = 1; }; +const T2 = struct { + const a = 1; + + b: u32, + []const u8, +}; + // error // backend=stage2 // target=native @@ -22,5 +29,8 @@ const T = struct { // :2:5: error: enum field missing name // :5:5: error: union field missing name // :8:5: error: tuple field has a name +// :9:5: note: tuple field here // :15:5: error: tuple declarations cannot contain declarations // :12:5: note: tuple field here +// :19:5: error: tuple declarations cannot contain declarations +// :22:5: note: tuple field here