authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-12-02 15:39:40+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-12-02 15:39:40+02:00
log86e6acb37b242a60917f5552999d918c24fdf791
tree773f4bf0f8026b52e62e616e390dd760882c0ef4
parent665eba93c1733f83614c443c19cd9a5f1be910df

AstGen: improve error message for missing parameter name

Closes #13393

2 files changed, 42 insertions(+), 0 deletions(-)

src/AstGen.zig+23
...@@ -3696,6 +3696,29 @@ fn fnDecl(...@@ -3696,6 +3696,29 @@ fn fnDecl(
3696 if (param.anytype_ellipsis3) |tok| {3696 if (param.anytype_ellipsis3) |tok| {
3697 return astgen.failTok(tok, "missing parameter name", .{});3697 return astgen.failTok(tok, "missing parameter name", .{});
3698 } else {3698 } else {
3699 ambiguous: {
3700 if (tree.nodes.items(.tag)[param.type_expr] != .identifier) break :ambiguous;
3701 const main_token = tree.nodes.items(.main_token)[param.type_expr];
3702 const identifier_str = tree.tokenSlice(main_token);
3703 if (isPrimitive(identifier_str)) break :ambiguous;
3704 return astgen.failNodeNotes(
3705 param.type_expr,
3706 "missing parameter name or type",
3707 .{},
3708 &[_]u32{
3709 try astgen.errNoteNode(
3710 param.type_expr,
3711 "if this is a name, annotate its type '{s}: T'",
3712 .{identifier_str},
3713 ),
3714 try astgen.errNoteNode(
3715 param.type_expr,
3716 "if this is a type, give it a name '<name>: {s}'",
3717 .{identifier_str},
3718 ),
3719 },
3720 );
3721 }
3699 return astgen.failNode(param.type_expr, "missing parameter name", .{});3722 return astgen.failNode(param.type_expr, "missing parameter name", .{});
3700 }3723 }
3701 } else 0;3724 } else 0;
test/cases/compile_errors/missing_parameter_name.zig created+19
...@@ -0,0 +1,19 @@
1fn f2(u64) u64 {
2 return x;
3}
4fn f3(*x) u64 {
5 return x;
6}
7fn f1(x) u64 {
8 return x;
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :1:7: error: missing parameter name
16// :4:7: error: missing parameter name
17// :7:7: error: missing parameter name or type
18// :7:7: note: if this is a name, annotate its type 'x: T'
19// :7:7: note: if this is a type, give it a name '<name>: x'