aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
authorLinus Torvalds <torvalds@home.transmeta.com>2003-04-04 22:28:30 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-07 21:00:14 -0700
commit8f827dfd41fba8f6772fbef65239a6f14f05cc0b (patch)
treea912e130f934824a9cda1015638e028845e3da4a
parent11468a914482b36067e5facf56fa6e40c875017f (diff)
downloadsparse-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.c10
-rw-r--r--pre-process.c4
-rw-r--r--token.h1
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)