]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
Filling up remaining gotos at the end of a function for when the label is defined...
authorWolfgang (Blub) Bumiller <blub@speed.at>
Sun, 25 Nov 2012 20:56:38 +0000 (21:56 +0100)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Sun, 25 Nov 2012 20:56:38 +0000 (21:56 +0100)
parser.c

index 67cf0fd2b01d6b40dbdbaf82f012e24b81a1932b..e7e205d26d6f9c26ec4bc8ce32a945b2d450c5e8 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -2382,6 +2382,7 @@ static bool parse_statement(parser_t *parser, ast_block *block, ast_expression *
     }
     else if (parser->tok == ':')
     {
     }
     else if (parser->tok == ':')
     {
+        size_t i;
         ast_label *label;
         if (!parser_next(parser)) {
             parseerror(parser, "expected label name");
         ast_label *label;
         if (!parser_next(parser)) {
             parseerror(parser, "expected label name");
@@ -2400,6 +2401,13 @@ static bool parse_statement(parser_t *parser, ast_block *block, ast_expression *
             parseerror(parser, "parse error after label");
             return false;
         }
             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 == ';')
         return true;
     }
     else if (parser->tok == ';')
@@ -3913,6 +3921,7 @@ skipvar:
         }
         else if (parser->tok == '{' || parser->tok == '[')
         {
         }
         else if (parser->tok == '{' || parser->tok == '[')
         {
+            size_t i;
             if (localblock) {
                 parseerror(parser, "cannot declare functions within functions");
                 break;
             if (localblock) {
                 parseerror(parser, "cannot declare functions within functions");
                 break;
@@ -3921,6 +3930,8 @@ skipvar:
             if (!parse_function_body(parser, var))
                 break;
             ast_delete(basetype);
             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;
             vec_free(parser->gotos);
             vec_free(parser->labels);
             return true;