diff options
| author | Linus Torvalds <torvalds@home.transmeta.com> | 2003-04-04 22:28:30 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-07 21:00:14 -0700 |
| commit | 8f827dfd41fba8f6772fbef65239a6f14f05cc0b (patch) | |
| tree | a912e130f934824a9cda1015638e028845e3da4a | |
| parent | 11468a914482b36067e5facf56fa6e40c875017f (diff) | |
| download | sparse-dev-8f827dfd41fba8f6772fbef65239a6f14f05cc0b.tar.gz | |
Add a "preprocessing" flag, so that the expression evaluator can
take the semantic differences into account (a undefined symbol
behaves differently in a C parse tree than in a preprocessor
expression)
| -rw-r--r-- | evaluate.c | 10 | ||||
| -rw-r--r-- | pre-process.c | 4 | ||||
| -rw-r--r-- | token.h | 1 |
3 files changed, 13 insertions, 2 deletions
@@ -29,6 +29,13 @@ static struct symbol *evaluate_symbol_expression(struct expression *expr) struct symbol *base_type; if (!sym) { + if (preprocessing) { + expr->type = EXPR_VALUE; + expr->value = 0; + expr->ctype = &int_ctype; + warn(expr->pos, "undefined preprocessor identifier '%s'", show_ident(expr->symbol_name)); + return &int_ctype; + } warn(expr->pos, "undefined identifier '%s'", show_ident(expr->symbol_name)); return NULL; } @@ -268,9 +275,8 @@ static struct symbol *evaluate_int_binop(struct expression *expr) static inline int lvalue_expression(struct expression *expr) { - return expr->type == EXPR_PREOP && expr->op == '*'; + return (expr->type == EXPR_PREOP && expr->op == '*') || expr->type == EXPR_BITFIELD; } - /* Arrays degenerate into pointers on pointer arithmetic */ static struct symbol *degenerate(struct expression *expr, struct symbol *ctype, struct expression **ptr_p) diff --git a/pre-process.c b/pre-process.c index f4cb0831..3a185f52 100644 --- a/pre-process.c +++ b/pre-process.c @@ -22,6 +22,8 @@ #include "symbol.h" #include "expression.h" +int preprocessing = 0; + #define MAXNEST (16) static int true_nesting = 0; static int false_nesting = 0; @@ -924,6 +926,7 @@ struct token * preprocess(struct token *token) { struct token header = { }; + preprocessing = 1; header.next = token; do_preprocess(&header); if (if_nesting) @@ -931,6 +934,7 @@ struct token * preprocess(struct token *token) // Drop all expressions from pre-processing, they're not used any more. clear_expression_alloc(); + preprocessing = 0; return header.next; } @@ -134,6 +134,7 @@ struct token { * This allows us to not test for NULL pointers * when following the token->next chain.. */ +extern int preprocessing; extern struct token eof_token_entry; #define eof_token(x) ((x) == &eof_token_entry) |
