initexpr = parse_expression_leave(parser, false, false, false);
if (!initexpr)
goto onerr;
-
/* move on to condition */
if (parser->tok != ';') {
parseerror(parser, "expected semicolon after for-loop initializer");
goto onerr;
}
-
if (!parser_next(parser)) {
parseerror(parser, "expected for-loop condition");
goto onerr;
}
}
+ else if (!parser_next(parser)) {
+ parseerror(parser, "expected for-loop condition");
+ goto onerr;
+ }
/* parse the condition */
if (parser->tok != ';') {
goto enderrfn;
}
- func->blocks.push_back(block);
+ func->blocks.emplace_back(block);
parser->function = old;
if (!parser_leaveblock(parser))
return false;
}
- func->blocks.push_back(body);
+ func->blocks.emplace_back(body);
*out = fval;
parser->accessors.push_back(fval);
parseerror(parser, "failed to build accessor search tree");
return false;
}
- if (!ast_block_add_expr(array->setter->constval.vfunc->blocks[0], root)) {
+ if (!ast_block_add_expr(array->setter->constval.vfunc->blocks[0].get(), root)) {
ast_delete(root);
return false;
}
}
array->setter = fval;
- return ast_block_add_expr(func->blocks[0], root);
+ return ast_block_add_expr(func->blocks[0].get(), root);
cleanup:
if (entity) ast_delete(entity);
if (index) ast_delete(index);
parseerror(parser, "failed to build accessor search tree");
return false;
}
- if (!ast_block_add_expr(array->getter->constval.vfunc->blocks[0], root)) {
+ if (!ast_block_add_expr(array->getter->constval.vfunc->blocks[0].get(), root)) {
ast_delete(root);
return false;
}
ast_delete(basetype);
for (auto &it : parser->gotos)
parseerror(parser, "undefined label: `%s`", it->name);
+ parser->gotos.clear();
+ parser->labels.clear();
return true;
} else {
ast_expression *cexp;
void parser_cleanup(parser_t *parser)
{
parser_remove_ast(parser);
+ parser->~parser_t();
mem_d(parser);
}
if (!func) {
if (OPTS_OPTION_BOOL(OPTION_COVERAGE)) {
con_out("coverage support requested but no coverage() builtin declared\n");
- ir_builder_delete(ir);
+ delete ir;
return false;
}
return true;
char ty[1024];
ast_type_to_string(expr, ty, sizeof(ty));
con_out("invalid type for coverage(): %s\n", ty);
- ir_builder_delete(ir);
+ delete ir;
return false;
}
return false;
}
- ir = ir_builder_new("gmqcc_out");
+ ir = new ir_builder("gmqcc_out");
if (!ir) {
con_out("failed to allocate builder\n");
return false;
field->hasvalue = false;
if (!ast_global_codegen((ast_value*)field, ir, true)) {
con_out("failed to generate field %s\n", field->name);
- ir_builder_delete(ir);
+ delete ir;
return false;
}
if (hasvalue) {
}
if (!ast_global_codegen(asvalue, ir, false)) {
con_out("failed to generate global %s\n", asvalue->name);
- ir_builder_delete(ir);
+ delete ir;
return false;
}
}
f->varargs->count = parser->max_param_count - f->function_type->type_params.size();
if (!parser_create_array_setter_impl(parser, f->varargs)) {
con_out("failed to generate vararg setter for %s\n", f->name);
- ir_builder_delete(ir);
+ delete ir;
return false;
}
if (!parser_create_array_getter_impl(parser, f->varargs)) {
con_out("failed to generate vararg getter for %s\n", f->name);
- ir_builder_delete(ir);
+ delete ir;
return false;
}
} else {
asvalue->name);
}
if (!ast_generate_accessors(asvalue, ir)) {
- ir_builder_delete(ir);
+ delete ir;
return false;
}
}
if (asvalue->vtype != TYPE_ARRAY)
continue;
if (!ast_generate_accessors(asvalue, ir)) {
- ir_builder_delete(ir);
+ delete ir;
return false;
}
}
!ast_global_codegen(parser->reserved_version, ir, false))
{
con_out("failed to generate reserved::version");
- ir_builder_delete(ir);
+ delete ir;
return false;
}
for (auto &f : parser->functions) {
if (!ast_function_codegen(f, ir)) {
con_out("failed to generate function %s\n", f->name);
- ir_builder_delete(ir);
+ delete ir;
return false;
}
}
for (auto &it : parser->functions) {
if (!ir_function_finalize(it->ir_func)) {
con_out("failed to finalize function %s\n", it->name);
- ir_builder_delete(ir);
+ delete ir;
return false;
}
}
if (!ir_builder_generate(ir, output)) {
con_out("*** failed to generate output file\n");
- ir_builder_delete(ir);
+ delete ir;
return false;
}
}
- ir_builder_delete(ir);
+ delete ir;
return retval;
}