authorgravatar for lars.scheme@gmail.comlars <lars.scheme@gmail.com> 2021-05-06 08:33:45+02:00
committergravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2021-05-06 18:44:10+02:00
log96e593145dcdb53ca02f2a365abc68415c4302b6
tree428bafc94779a7d7ee3f28968ea689c1dbbc6b58
parent88d40fc005894ef84eb8bf54314da293772c4bba

stage1: improve message for missing fn return type

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.

1 files changed, 10 insertions(+), 1 deletions(-)

src/stage1/parser.cpp+10-1
...@@ -825,7 +825,16 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc) {...@@ -825,7 +825,16 @@ static AstNode *ast_parse_fn_proto(ParseContext *pc) {
825 AstNode *return_type = nullptr;825 AstNode *return_type = nullptr;
826 if (anytype == nullptr) {826 if (anytype == nullptr) {
827 exmark = eat_token_if(pc, TokenIdBang);827 exmark = eat_token_if(pc, TokenIdBang);
828 return_type = ast_expect(pc, ast_parse_type_expr);828 return_type = ast_parse_type_expr(pc);
829 if (return_type == nullptr) {
830 Token *next = peek_token(pc);
831 ast_error(
832 pc,
833 next,
834 "expected return type (use 'void' to return nothing), found: '%s'",
835 token_name(next->id)
836 );
837 }
829 }838 }
830839
831 AstNode *res = ast_create_node(pc, NodeTypeFnProto, first);840 AstNode *res = ast_create_node(pc, NodeTypeFnProto, first);