aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/expression.c
diff options
authorLinus Torvalds <torvalds@ppc970.osdl.org>2004-03-26 11:07:42 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-07 21:01:30 -0700
commit214912ea0d1ab7ae692f2d7e0d45b080f4273eb6 (patch)
treeeb3f96cbb33a05b9ab6810fa96439b849a9f8fab /expression.c
parent16b4f3946def0869d1afa437763915d03aefff9c (diff)
downloadsparse-dev-214912ea0d1ab7ae692f2d7e0d45b080f4273eb6.tar.gz
Clean up type expression syntax.
We now require square brackets around the type, to avoid any confusion with casts or variable declarations: if ([typeof(x)] == [int]) ...
Diffstat (limited to 'expression.c')
-rw-r--r--expression.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/expression.c b/expression.c
index 15838745..dc022356 100644
--- a/expression.c
+++ b/expression.c
@@ -211,8 +211,8 @@ struct token *primary_expression(struct token *token, struct expression **tree)
* if (typeof(a) == int) ..
*/
if (sym && sym->namespace == NS_TYPEDEF) {
- next = typename(token, &sym);
- expr->type = EXPR_TYPE;
+ warn(token->pos, "typename in expression");
+ sym = NULL;
}
expr->symbol_name = token->ident;
expr->symbol = sym;
@@ -233,6 +233,13 @@ struct token *primary_expression(struct token *token, struct expression **tree)
token = parens_expression(token, &expr->unop, "in expression");
break;
}
+ if (token->special == '[' && lookup_type(token->next)) {
+ expr = alloc_expression(token->pos, EXPR_TYPE);
+ token = typename(token->next, &expr->symbol);
+ token = expect(token, ']', "in type expression");
+ break;
+ }
+
default:
;
}