Skip to content

Commit

Permalink
stage1: improve message for missing fn return type
Browse files Browse the repository at this point in the history
Coming from other languages it might be tempting for programmers to
accidentally leave out the return type instead of returning 'void'.

The error for this used to be

    error: invalid token: '{'
    pub fn main() {
                  ^

which is misleading. The '{' is expected but only after a return type.

The new message is

    error: expected return type (use 'void' to return nothing), found: '{'
    pub fn main() {
                  ^

which not only points out the real error but also hints at a (probably)
very common case where someone coming from e.g. Go is used to not
specifying a return type if a function returns nothing and thus forgets
to put 'void' there.

It might seem overkill to hint at the 'void' option but then the
compiler error messages are our user interface to the programmer. We
can be better than other languages in our error messages and leaving
out the return type seems to be a rather clear indication of the above
mentioned issue. Adding this will help more than distract.
  • Loading branch information
lars authored and ifreund committed May 6, 2021
1 parent 88d40fc commit 96e5931
Showing 1 changed file with 10 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/stage1/parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -825,7 +825,16 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc) {
AstNode *return_type = nullptr;
if (anytype == nullptr) {
exmark = eat_token_if(pc, TokenIdBang);
return_type = ast_expect(pc, ast_parse_type_expr);
return_type = ast_parse_type_expr(pc);
if (return_type == nullptr) {
Token *next = peek_token(pc);
ast_error(
pc,
next,
"expected return type (use 'void' to return nothing), found: '%s'",
token_name(next->id)
);
}
}

AstNode *res = ast_create_node(pc, NodeTypeFnProto, first);
Expand Down

2 comments on commit 96e5931

@xackus
Copy link
Contributor

@xackus xackus commented on 96e5931 May 7, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A test in test/compile_errors.zig would make sure this is transferred over to stage2.

@ifreund
Copy link
Member

@ifreund ifreund commented on 96e5931 May 7, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A test in test/compile_errors.zig would make sure this is transferred over to stage2.

Note that we already have a separate compile error for missing return types in stage2, which is tested here:

test "recovery: missing return type" {

Please sign in to comment.