diff options
| author | gingerBill <bill@gingerbill.org> | 2018-09-11 10:55:30 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2018-09-11 10:55:30 +0100 |
| commit | 91477e9e69aa6027953702a4c5ca5f6cda7e0ed8 (patch) | |
| tree | 3169eff5fa19c68d184be5dc36ec6b31952418d5 /src/parser.cpp | |
| parent | cfd0dfd2bf24c8e33e37c689b4144b1180bbcb05 (diff) | |
Allow for optional ok for return
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index cfdd9ad01..a162a4ee3 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1593,6 +1593,28 @@ Ast *convert_stmt_to_body(AstFile *f, Ast *stmt) { } +void check_polymorphic_params_for_type(AstFile *f, Ast *polymorphic_params, Token token) { + if (polymorphic_params == nullptr) { + return; + } + if (polymorphic_params->kind != Ast_FieldList) { + return; + } + ast_node(fl, FieldList, polymorphic_params); + for_array(fi, fl->list) { + Ast *field = fl->list[fi]; + if (field->kind != Ast_Field) { + continue; + } + for_array(i, field->Field.names) { + Ast *name = field->Field.names[i]; + if (name->kind == Ast_PolyType) { + error(name, "Polymorphic names are not needed for %.*s parameters", LIT(token.string)); + return; // TODO(bill): Err multiple times or just the once? + } + } + } +} Ast *parse_operand(AstFile *f, bool lhs) { @@ -1855,6 +1877,7 @@ Ast *parse_operand(AstFile *f, bool lhs) { polymorphic_params = nullptr; } expect_token_after(f, Token_CloseParen, "parameter list"); + check_polymorphic_params_for_type(f, polymorphic_params, token); } isize prev_level = f->expr_level; @@ -1921,6 +1944,7 @@ Ast *parse_operand(AstFile *f, bool lhs) { polymorphic_params = nullptr; } expect_token_after(f, Token_CloseParen, "parameter list"); + check_polymorphic_params_for_type(f, polymorphic_params, token); } while (allow_token(f, Token_Hash)) { |