__builtin_debug_printtype directive... helped me down tracking a bug: parsing typedeffed types in parameter lists properly now

This commit is contained in:
Wolfgang (Blub) Bumiller 2012-11-25 22:57:11 +01:00
parent 08ef8bd045
commit 2f5a26a4de
2 changed files with 42 additions and 8 deletions

View file

@ -48,7 +48,9 @@ static const char *keywords_fg[] = {
"struct", "union",
"break", "continue",
"typedef",
"goto"
"goto",
"__builtin_debug_printtype"
};
static size_t num_keywords_fg = sizeof(keywords_fg) / sizeof(keywords_fg[0]);

View file

@ -2326,6 +2326,39 @@ ident_var:
*out = NULL;
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"))
{
return parse_return(parser, block, out);
@ -3390,14 +3423,13 @@ static ast_value *parse_typename(parser_t *parser, ast_value **storebase, ast_va
return NULL;
}
}
}
if (parser->tok == TOKEN_IDENT)
cached_typedef = parser_find_typedef(parser, parser_tokval(parser), 0);
if (!cached_typedef && parser->tok != TOKEN_TYPENAME) {
parseerror(parser, "expected typename");
return NULL;
}
}
/* generate the basic type value */
if (cached_typedef) {