X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=parser.c;h=efcacced30417a88337c6478bbcf26a24ba7ee5b;hb=150c6e21e70d7799d77c234bb6e350c558bc628f;hp=5bae9da1887a1a3badfb70609c40141b21e251e4;hpb=ee7d45f492231cb1720b69b8daa8267f2673ccaf;p=xonotic%2Fgmqcc.git diff --git a/parser.c b/parser.c index 5bae9da..efcacce 100644 --- a/parser.c +++ b/parser.c @@ -1531,16 +1531,21 @@ static bool parser_close_paren(parser_t *parser, shunt *sy, bool functions_only) } */ while (vec_size(sy->ops)) { - if (sy->ops[vec_size(sy->ops)-1].paren == SY_PAREN_FUNC) { + if (vec_last(sy->ops).paren == SY_PAREN_FUNC) { if (!parser_close_call(parser, sy)) return false; break; } - if (sy->ops[vec_size(sy->ops)-1].paren == SY_PAREN_EXPR) { + if (vec_last(sy->ops).paren == SY_PAREN_EXPR) { + if (!vec_size(sy->out)) { + compile_error(vec_last(sy->ops).ctx, "empty paren expression"); + vec_shrinkby(sy->ops, 1); + return false; + } vec_shrinkby(sy->ops, 1); return !functions_only; } - if (sy->ops[vec_size(sy->ops)-1].paren == SY_PAREN_INDEX) { + if (vec_last(sy->ops).paren == SY_PAREN_INDEX) { if (functions_only) return false; /* pop off the parenthesis */ @@ -1550,7 +1555,7 @@ static bool parser_close_paren(parser_t *parser, shunt *sy, bool functions_only) return false; return true; } - if (sy->ops[vec_size(sy->ops)-1].paren == SY_PAREN_TERNARY) { + if (vec_last(sy->ops).paren == SY_PAREN_TERNARY) { if (functions_only) return false; if (vec_last(parser->pot) != POT_TERNARY1) { @@ -1679,6 +1684,7 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma { ast_expression *expr = NULL; shunt sy; + size_t i; bool wantop = false; /* only warn once about an assignment in a truth value because the current code * would trigger twice on: if(a = b && ...), once for the if-truth-value, once for the && part @@ -2136,6 +2142,10 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma onerr: parser->lex->flags.noops = true; + for (i = 0; i < vec_size(sy.out); ++i) { + if (sy.out[i].out) + ast_unref(sy.out[i].out); + } vec_free(sy.out); vec_free(sy.ops); return NULL; @@ -4049,13 +4059,13 @@ static bool parse_function_body(parser_t *parser, ast_value *var) if (!parser_create_array_setter_proto(parser, varargs, name)) { ast_delete(varargs); ast_block_delete(block); - goto enderr; + goto enderrfn; } snprintf(name, sizeof(name), "%s##va##GET", var->name); if (!parser_create_array_getter_proto(parser, varargs, varargs->expression.next, name)) { ast_delete(varargs); ast_block_delete(block); - goto enderr; + goto enderrfn; } func->varargs = varargs; }