From 3fcb4408a55f3d0fb27f69555c62da81b6e9339c Mon Sep 17 00:00:00 2001 From: mlugg Date: Mon, 24 Feb 2025 14:37:18 +0000 Subject: [PATCH] AstGen: improve 'file cannot be a tuple' source location Instead of just reporting this on token 0, report it on the first tuple-like field. --- lib/std/zig/AstGen.zig | 18 ++++++++---------- .../file_level_tuple_with_decls.zig | 7 +++++++ 2 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 test/cases/compile_errors/file_level_tuple_with_decls.zig diff --git a/lib/std/zig/AstGen.zig b/lib/std/zig/AstGen.zig index c7f2426b0a..5dc41cc9d2 100644 --- a/lib/std/zig/AstGen.zig +++ b/lib/std/zig/AstGen.zig @@ -5097,18 +5097,16 @@ fn structDeclInner( const gpa = astgen.gpa; const tree = astgen.tree; - { - const is_tuple = for (container_decl.ast.members) |member_node| { + is_tuple: { + const tuple_field_node = for (container_decl.ast.members) |member_node| { const container_field = tree.fullContainerField(member_node) orelse continue; - if (container_field.ast.tuple_like) break true; - } else false; + if (container_field.ast.tuple_like) break member_node; + } else break :is_tuple; - if (is_tuple) { - if (node == 0) { - return astgen.failTok(0, "file cannot be a tuple", .{}); - } else { - return tupleDecl(gz, scope, node, container_decl, layout, backing_int_node); - } + if (node == 0) { + return astgen.failNode(tuple_field_node, "file cannot be a tuple", .{}); + } else { + return tupleDecl(gz, scope, node, container_decl, layout, backing_int_node); } } diff --git a/test/cases/compile_errors/file_level_tuple_with_decls.zig b/test/cases/compile_errors/file_level_tuple_with_decls.zig new file mode 100644 index 0000000000..0b353fe227 --- /dev/null +++ b/test/cases/compile_errors/file_level_tuple_with_decls.zig @@ -0,0 +1,7 @@ +const std = @import("std"); + +u8, + +// error +// +// :3:1: error: file cannot be a tuple