diff --git a/src/compiler/enums.h b/src/compiler/enums.h index d899c475c..2c1689b90 100644 --- a/src/compiler/enums.h +++ b/src/compiler/enums.h @@ -611,9 +611,9 @@ typedef enum case TOKEN_UPTR: case TOKEN_USHORT: case TOKEN_USIZE:\ case TOKEN_USZ: case TOKEN_ISZ: case TOKEN_FLOAT128: case TOKEN_TYPEID: case TOKEN_ANYERR: case TOKEN_VARIANT #define TYPE_TOKENS NON_VOID_TYPE_TOKENS: case TOKEN_VOID -#define TYPELIKE_TOKENS TYPE_TOKENS: case TOKEN_TYPE_IDENT: \ - case TOKEN_CT_TYPE_IDENT: case TOKEN_CT_TYPEOF: case TOKEN_CT_EVALTYPE: \ +#define CT_TYPE_TOKENS TOKEN_CT_TYPE_IDENT: case TOKEN_CT_TYPEOF: case TOKEN_CT_EVALTYPE: \ case TOKEN_CT_VATYPE: case TOKEN_CT_TYPEFROM +#define TYPELIKE_TOKENS TYPE_TOKENS: case TOKEN_TYPE_IDENT: case CT_TYPE_TOKENS // Note that ordering matters here. If ordering is changed, // So must type_find_max_type and friends. diff --git a/src/compiler/parse_expr.c b/src/compiler/parse_expr.c index bf117bda0..dc7eeb654 100644 --- a/src/compiler/parse_expr.c +++ b/src/compiler/parse_expr.c @@ -725,14 +725,14 @@ static Expr *parse_call_expr(ParseContext *c, Expr *left) params = VECNEW(Expr*, 4); if (!parse_arg_list(c, ¶ms, TOKEN_RPAREN, &splat, true)) return poisoned_expr; } - if (try_consume(c, TOKEN_EOS) && !tok_is(c, TOKEN_RPAREN)) + if (try_consume(c, TOKEN_EOS)) { if (!parse_next_may_be_type_or_ident(c)) { SEMA_ERROR_LAST("Expected an ending ')'. Did you forget a ')' before this ';'?"); return poisoned_expr; } - if (!parse_parameters(c, VISIBLE_LOCAL, &body_args, NULL, NULL, NULL)) return poisoned_expr; + if (!parse_parameters(c, VISIBLE_LOCAL, &body_args, NULL, NULL, NULL, true)) return poisoned_expr; } if (!tok_is(c, TOKEN_RPAREN)) { diff --git a/src/compiler/parse_global.c b/src/compiler/parse_global.c index 824e87740..f1b76d1e5 100644 --- a/src/compiler/parse_global.c +++ b/src/compiler/parse_global.c @@ -1127,7 +1127,7 @@ static inline bool parse_param_decl(ParseContext *c, Visibility parent_visibilit return true; } -bool parse_next_is_typed_parameter(ParseContext *c) +static bool parse_next_is_typed_parameter(ParseContext *c, bool is_body_param) { switch (c->tok) { @@ -1138,6 +1138,8 @@ bool parse_next_is_typed_parameter(ParseContext *c) case TYPE_TOKENS: case TOKEN_TYPE_IDENT: return true; + case CT_TYPE_TOKENS: + return is_body_param; default: return false; } @@ -1154,7 +1156,7 @@ INLINE bool is_end_of_param_list(ParseContext *c) * | ELLIPSIS (CT_TYPE_IDENT | non_type_ident ('=' expr)?)? */ bool parse_parameters(ParseContext *c, Visibility visibility, Decl ***params_ref, Decl **body_params, - Variadic *variadic, int *vararg_index_ref) + Variadic *variadic, int *vararg_index_ref, bool is_body_params) { Decl** params = NULL; bool var_arg_found = false; @@ -1194,7 +1196,7 @@ bool parse_parameters(ParseContext *c, Visibility visibility, Decl ***params_ref // Now we have the following possibilities: "foo", "Foo foo", "Foo... foo", "foo...", "Foo" TypeInfo *type = NULL; - if (parse_next_is_typed_parameter(c)) + if (parse_next_is_typed_parameter(c, is_body_params)) { // Parse the type, ASSIGN_TYPE_OR_RET(type, parse_optional_type(c), false); @@ -1373,7 +1375,7 @@ static inline bool parse_fn_parameter_list(ParseContext *c, Visibility parent_vi CONSUME_OR_RET(TOKEN_LPAREN, false); Variadic variadic = VARIADIC_NONE; int vararg_index = -1; - if (!parse_parameters(c, parent_visibility, &decls, NULL, &variadic, &vararg_index)) return false; + if (!parse_parameters(c, parent_visibility, &decls, NULL, &variadic, &vararg_index, false)) return false; CONSUME_OR_RET(TOKEN_RPAREN, false); signature->vararg_index = vararg_index < 0 ? vec_size(decls) : vararg_index; signature->params = decls; @@ -1621,7 +1623,7 @@ static bool parse_macro_arguments(ParseContext *c, Visibility visibility, Decl * Variadic variadic = VARIADIC_NONE; int vararg_index = -1; Decl **params = NULL; - if (!parse_parameters(c, visibility, ¶ms, NULL, &variadic, &vararg_index)) return false; + if (!parse_parameters(c, visibility, ¶ms, NULL, &variadic, &vararg_index, false)) return false; macro->func_decl.signature.params = params; macro->func_decl.signature.vararg_index = vararg_index < 0 ? vec_size(params) : vararg_index; macro->func_decl.signature.variadic = variadic; @@ -1634,7 +1636,7 @@ static bool parse_macro_arguments(ParseContext *c, Visibility visibility, Decl * TRY_CONSUME_OR_RET(TOKEN_AT_IDENT, "Expected an ending ')' or a block parameter on the format '@block(...).", false); if (try_consume(c, TOKEN_LPAREN)) { - if (!parse_parameters(c, visibility, &body_param->body_params, NULL, NULL, NULL)) return false; + if (!parse_parameters(c, visibility, &body_param->body_params, NULL, NULL, NULL, false)) return false; CONSUME_OR_RET(TOKEN_RPAREN, false); } macro->func_decl.body_param = declid(body_param); @@ -1848,7 +1850,7 @@ static inline Decl *parse_define_attribute(ParseContext *c, Visibility visibilit if (try_consume(c, TOKEN_LPAREN)) { - if (!parse_parameters(c, visibility, &decl->attr_decl.params, NULL, NULL, NULL)) return poisoned_decl; + if (!parse_parameters(c, visibility, &decl->attr_decl.params, NULL, NULL, NULL, false)) return poisoned_decl; CONSUME_OR_RET(TOKEN_RPAREN, poisoned_decl); } diff --git a/src/compiler/parser_internal.h b/src/compiler/parser_internal.h index 0295e2414..4bdd43cd6 100644 --- a/src/compiler/parser_internal.h +++ b/src/compiler/parser_internal.h @@ -47,8 +47,8 @@ Decl *parse_decl_after_type(ParseContext *c, TypeInfo *type); Decl *parse_var_decl(ParseContext *c); bool -parse_parameters(ParseContext *c, Visibility visibility, Decl ***params_ref, Decl **body_params, Variadic *variadic, - int *vararg_index_ref); +parse_parameters(ParseContext *c, Visibility visibility, Decl ***params_ref, Decl **body_params, + Variadic *variadic, int *vararg_index_ref, bool is_body_params); bool parse_arg_list(ParseContext *c, Expr ***result, TokenType param_end, bool *splat, bool vasplat); Expr *parse_type_compound_literal_expr_after_type(ParseContext *c, TypeInfo *type_info); diff --git a/src/version.h b/src/version.h index 671b86583..6c1dc3d3c 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define COMPILER_VERSION "0.3.113" \ No newline at end of file +#define COMPILER_VERSION "0.3.114" \ No newline at end of file