}
else if (parser->tok == ':')
{
+ size_t i;
ast_label *label;
if (!parser_next(parser)) {
parseerror(parser, "expected label name");
parseerror(parser, "parse error after label");
return false;
}
+ for (i = 0; i < vec_size(parser->gotos); ++i) {
+ if (!strcmp(parser->gotos[i]->name, label->name)) {
+ ast_goto_set_label(parser->gotos[i], label);
+ vec_remove(parser->gotos, i, 1);
+ --i;
+ }
+ }
return true;
}
else if (parser->tok == ';')
}
else if (parser->tok == '{' || parser->tok == '[')
{
+ size_t i;
if (localblock) {
parseerror(parser, "cannot declare functions within functions");
break;
if (!parse_function_body(parser, var))
break;
ast_delete(basetype);
+ for (i = 0; i < vec_size(parser->gotos); ++i)
+ parseerror(parser, "undefined label: `%s`", parser->gotos[i]->name);
vec_free(parser->gotos);
vec_free(parser->labels);
return true;