X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=parser.c;h=30a9d7866ef691f06768f2cb496228d4439077d5;hb=19331ee385cb3c39139a284e2ab1053420b18fe3;hp=2585f69576a4c76eab79eaba6953096ba8dde68b;hpb=92c0d6157c3d6b24ffff811a989572e2ae6d92f9;p=xonotic%2Fgmqcc.git diff --git a/parser.c b/parser.c index 2585f69..30a9d78 100644 --- a/parser.c +++ b/parser.c @@ -3335,7 +3335,7 @@ static bool parse_statement(parser_t *parser, ast_block *block, ast_expression * if (parser->tok == TOKEN_IDENT) typevar = parser_find_typedef(parser, parser_tokval(parser), 0); - if (typevar || parser->tok == TOKEN_TYPENAME || parser->tok == '.') + if (typevar || parser->tok == TOKEN_TYPENAME || parser->tok == '.' || parser->tok == TOKEN_DOTS) { /* local variable */ if (!block) { @@ -4709,8 +4709,10 @@ static ast_value *parse_typename(parser_t *parser, ast_value **storebase, ast_va ctx = parser_ctx(parser); /* types may start with a dot */ - if (parser->tok == '.') { + if (parser->tok == '.' || parser->tok == TOKEN_DOTS) { isfield = true; + if (parser->tok == TOKEN_DOTS) + morefields += 2; /* if we parsed a dot we need a typename now */ if (!parser_next(parser)) { parseerror(parser, "expected typename for field definition"); @@ -4720,8 +4722,13 @@ static ast_value *parse_typename(parser_t *parser, ast_value **storebase, ast_va /* Further dots are handled seperately because they won't be part of the * basetype */ - while (parser->tok == '.') { - ++morefields; + while (true) { + if (parser->tok == '.') + ++morefields; + else if (parser->tok == TOKEN_DOTS) + morefields += 3; + else + break; if (!parser_next(parser)) { parseerror(parser, "expected typename for field definition"); return NULL; @@ -5767,7 +5774,7 @@ static bool parser_global_statement(parser_t *parser) if (parser->tok == TOKEN_IDENT) istype = parser_find_typedef(parser, parser_tokval(parser), 0); - if (istype || parser->tok == TOKEN_TYPENAME || parser->tok == '.') + if (istype || parser->tok == TOKEN_TYPENAME || parser->tok == '.' || parser->tok == TOKEN_DOTS) { return parse_variable(parser, NULL, false, CV_NONE, istype, false, false, 0, NULL); }