mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-27 22:22:17 +00:00
__builtin_debug_printtype directive... helped me down tracking a bug: parsing typedeffed types in parameter lists properly now
This commit is contained in:
parent
08ef8bd045
commit
2f5a26a4de
2 changed files with 42 additions and 8 deletions
4
lexer.c
4
lexer.c
|
@ -48,7 +48,9 @@ static const char *keywords_fg[] = {
|
||||||
"struct", "union",
|
"struct", "union",
|
||||||
"break", "continue",
|
"break", "continue",
|
||||||
"typedef",
|
"typedef",
|
||||||
"goto"
|
"goto",
|
||||||
|
|
||||||
|
"__builtin_debug_printtype"
|
||||||
};
|
};
|
||||||
static size_t num_keywords_fg = sizeof(keywords_fg) / sizeof(keywords_fg[0]);
|
static size_t num_keywords_fg = sizeof(keywords_fg) / sizeof(keywords_fg[0]);
|
||||||
|
|
||||||
|
|
46
parser.c
46
parser.c
|
@ -2326,6 +2326,39 @@ ident_var:
|
||||||
*out = NULL;
|
*out = NULL;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (!strcmp(parser_tokval(parser), "__builtin_debug_printtype"))
|
||||||
|
{
|
||||||
|
char ty[1024];
|
||||||
|
ast_value *tdef;
|
||||||
|
|
||||||
|
if (!parser_next(parser)) {
|
||||||
|
parseerror(parser, "parse error after __builtin_debug_printtype");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parser->tok == TOKEN_IDENT && (tdef = parser_find_typedef(parser, parser_tokval(parser), 0)))
|
||||||
|
{
|
||||||
|
ast_type_to_string((ast_expression*)tdef, ty, sizeof(ty));
|
||||||
|
con_out("__builtin_debug_printtype: `%s`=`%s`\n", tdef->name, ty);
|
||||||
|
if (!parser_next(parser)) {
|
||||||
|
parseerror(parser, "parse error after __builtin_debug_printtype typename argument");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!parse_statement(parser, block, out, allow_cases))
|
||||||
|
return false;
|
||||||
|
if (!*out)
|
||||||
|
con_out("__builtin_debug_printtype: got no output node\n");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ast_type_to_string(*out, ty, sizeof(ty));
|
||||||
|
con_out("__builtin_debug_printtype: `%s`\n", ty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else if (!strcmp(parser_tokval(parser), "return"))
|
else if (!strcmp(parser_tokval(parser), "return"))
|
||||||
{
|
{
|
||||||
return parse_return(parser, block, out);
|
return parse_return(parser, block, out);
|
||||||
|
@ -3390,13 +3423,12 @@ static ast_value *parse_typename(parser_t *parser, ast_value **storebase, ast_va
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (parser->tok == TOKEN_IDENT)
|
if (parser->tok == TOKEN_IDENT)
|
||||||
cached_typedef = parser_find_typedef(parser, parser_tokval(parser), 0);
|
cached_typedef = parser_find_typedef(parser, parser_tokval(parser), 0);
|
||||||
if (!cached_typedef && parser->tok != TOKEN_TYPENAME) {
|
if (!cached_typedef && parser->tok != TOKEN_TYPENAME) {
|
||||||
parseerror(parser, "expected typename");
|
parseerror(parser, "expected typename");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* generate the basic type value */
|
/* generate the basic type value */
|
||||||
|
|
Loading…
Reference in a new issue