diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2007-06-23 23:27:26 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2007-06-25 15:51:49 -0400 |
| commit | 361908cf099b011f173a1ea3053f84eb8a08841e (patch) | |
| tree | 1dba3c998ad17946733464206cd6704452a57bf0 | |
| parent | f78588abcebac0462764e5c8a3c91fa7a13bad45 (diff) | |
| download | sparse-dev-361908cf099b011f173a1ea3053f84eb8a08841e.tar.gz | |
[PATCH] deal with enum members without excessive PITA
mark symbols for enum members, have primary_expression() copy their
->initializer instead of dancing through the EXRP_SYMBOL with
expand_expression() finally getting to the damn thing.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| -rw-r--r-- | expression.c | 7 | ||||
| -rw-r--r-- | parse.c | 1 | ||||
| -rw-r--r-- | symbol.h | 2 |
3 files changed, 9 insertions, 1 deletions
diff --git a/expression.c b/expression.c index cf076a9e..a40ab2bc 100644 --- a/expression.c +++ b/expression.c @@ -359,6 +359,13 @@ struct token *primary_expression(struct token *token, struct expression **tree) token = builtin_types_compatible_p_expr(token, &expr); break; } + } else if (sym->enum_member) { + expr = alloc_expression(token->pos, EXPR_VALUE); + *expr = *sym->initializer; + /* we want the right position reported, thus the copy */ + expr->pos = token->pos; + token = next; + break; } expr = alloc_expression(token->pos, EXPR_SYMBOL); @@ -667,6 +667,7 @@ static struct token *parse_enum_declaration(struct token *token, struct symbol * } sym->initializer = expr; + sym->enum_member = 1; sym->ctype.base_type = parent; add_ptr_list(&entries, sym); @@ -109,7 +109,7 @@ extern int expand_constant_p(struct expression *expr, int cost); struct symbol { enum type type:8; enum namespace namespace:9; - unsigned char used:1, attr:2; + unsigned char used:1, attr:2, enum_member:1; struct position pos; /* Where this symbol was declared */ struct ident *ident; /* What identifier this symbol is associated with */ struct symbol *next_id; /* Next semantic symbol that shares this identifier */ |
