From 8f827dfd41fba8f6772fbef65239a6f14f05cc0b Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 4 Apr 2003 22:28:30 -0700 Subject: [PATCH] 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) --- evaluate.c | 10 ++++++++-- pre-process.c | 4 ++++ token.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/evaluate.c b/evaluate.c index 84e69615..14152950 100644 --- a/evaluate.c +++ b/evaluate.c @@ -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; } diff --git a/token.h b/token.h index db61c065..21db2aae 100644 --- a/token.h +++ b/token.h @@ -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) -- 2.11.4.GIT