goto on_error;
}
+ if (params.p_count > 8)
+ parseerror(parser, "more than 8 parameters are currently not supported");
+
var = ast_value_new(ctx, "<unnamed>", vtype);
if (!var)
goto on_error;
static sy_elem syexp(lex_ctx ctx, ast_expression *v) {
sy_elem e;
e.etype = 0;
+ e.off = 0;
e.out = v;
e.block = NULL;
e.ctx = ctx;
static sy_elem syblock(lex_ctx ctx, ast_block *v) {
sy_elem e;
e.etype = 0;
+ e.off = 0;
e.out = (ast_expression*)v;
e.block = v;
e.ctx = ctx;
static sy_elem syop(lex_ctx ctx, const oper_info *op) {
sy_elem e;
e.etype = 1 + (op - operators);
+ e.off = 0;
e.out = NULL;
e.block = NULL;
e.ctx = ctx;
break;
case opid1('='):
- if (ast_istype(exprs[0], ast_entfield))
+ if (ast_istype(exprs[0], ast_entfield)) {
+ ast_expression *field = ((ast_entfield*)exprs[0])->field;
assignop = type_storep_instr[exprs[0]->expression.vtype];
+ if (!ast_compare_type(field->expression.next, exprs[1])) {
+ char ty1[1024];
+ char ty2[1024];
+ ast_type_to_string(field->expression.next, ty1, sizeof(ty1));
+ ast_type_to_string(exprs[1], ty2, sizeof(ty2));
+ if (opts_standard == COMPILER_QCC &&
+ field->expression.next->expression.vtype == TYPE_FUNCTION &&
+ exprs[1]->expression.vtype == TYPE_FUNCTION)
+ {
+ if (parsewarning(parser, WARN_ASSIGN_FUNCTION_TYPES,
+ "invalid types in assignment: cannot assign %s to %s", ty2, ty1))
+ {
+ parser->errors++;
+ }
+ }
+ else
+ parseerror(parser, "invalid types in assignment: cannot assign %s to %s", ty2, ty1);
+ }
+ }
else
+ {
assignop = type_store_instr[exprs[0]->expression.vtype];
+ if (!ast_compare_type(exprs[0], exprs[1])) {
+ char ty1[1024];
+ char ty2[1024];
+ ast_type_to_string(exprs[0], ty1, sizeof(ty1));
+ ast_type_to_string(exprs[1], ty2, sizeof(ty2));
+ if (opts_standard == COMPILER_QCC &&
+ exprs[0]->expression.vtype == TYPE_FUNCTION &&
+ exprs[1]->expression.vtype == TYPE_FUNCTION)
+ {
+ if (parsewarning(parser, WARN_ASSIGN_FUNCTION_TYPES,
+ "invalid types in assignment: cannot assign %s to %s", ty2, ty1))
+ {
+ parser->errors++;
+ }
+ }
+ else
+ parseerror(parser, "invalid types in assignment: cannot assign %s to %s", ty2, ty1);
+ }
+ }
out = (ast_expression*)ast_store_new(ctx, assignop, exprs[0], exprs[1]);
break;
case opid2('+','='):
MEM_VECTOR_MOVE(params, exprs, call, params);
ast_delete(params);
}
+ if (!ast_call_check_types(call))
+ parser->errors++;
} else {
parseerror(parser, "invalid function call");
return false;
break;
if (!parse_statement(parser, block, &expr)) {
- parseerror(parser, "parse error");
+ /* parseerror(parser, "parse error"); */
block = NULL;
goto cleanup;
}
ast_expression *framenum = NULL;
ast_expression *nextthink = NULL;
/* None of the following have to be deleted */
- ast_expression *fld_think, *fld_nextthink, *fld_frame;
- ast_expression *gbl_time, *gbl_self;
+ ast_expression *fld_think = NULL, *fld_nextthink = NULL, *fld_frame = NULL;
+ ast_expression *gbl_time = NULL, *gbl_self = NULL;
bool has_frame_think;
bool retval = true;
parser->function = func;
if (!parse_block_into(parser, block, true)) {
ast_block_delete(block);
- goto enderrfn;
+ goto enderrfn2;
}
if (!ast_function_blocks_add(func, block)) {
ast_block_delete(block);
- goto enderrfn;
+ goto enderrfn2;
}
parser->function = old;
parseerror(parser, "missing semicolon after function body (mandatory with -std=qcc)");
return retval;
+enderrfn2:
+ parser->functions_count--;
enderrfn:
ast_function_delete(func);
var->constval.vfunc = NULL;
if (parser->tok == TOKEN_EOF)
parseerror(parser, "unexpected eof");
else if (!parser->errors)
- parseerror(parser, "parse error");
+ parseerror(parser, "there have been errors, bailing out");
lex_close(parser->lex);
parser->lex = NULL;
return false;