summaryrefslogtreecommitdiff
path: root/glcpp.h
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2010-05-20 08:01:44 -0700
committerCarl Worth <cworth@cworth.org>2010-05-20 08:01:44 -0700
commitb569383bbdfa22ed591255f56fb93832633a95ae (patch)
tree04a52c022ccec5658c0fac901f427fefafbadc17 /glcpp.h
parent472524413d004680dbdb89602617f32da8f42f56 (diff)
Avoid re-expanding a macro name that has once been rejected from expansion.
The specification of the preprocessor in C99 says that when we see a macro name that we are already expanding that we refuse to expand it now, (which we've done for a while), but also that we refuse to ever expand it later if seen in other contexts at which it would be legitimate to expand. We add a test case for that here, and fix it to work. The fix takes advantage of a new token_t value for tokens and argument words along with the recently added IDENTIFIER_FINALIZED token type which instructs the parser to not even look for another expansion.
Diffstat (limited to 'glcpp.h')
-rw-r--r--glcpp.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/glcpp.h b/glcpp.h
index c647e2a72e..5432a31817 100644
--- a/glcpp.h
+++ b/glcpp.h
@@ -42,6 +42,11 @@ typedef struct string_list {
string_node_t *tail;
} string_list_t;
+typedef struct token {
+ int type;
+ char *value;
+} token_t;
+
typedef struct token_node {
int type;
const char *value;
@@ -68,6 +73,7 @@ typedef struct glcpp_parser glcpp_parser_t;
typedef enum {
TOKEN_CLASS_ARGUMENT,
TOKEN_CLASS_IDENTIFIER,
+ TOKEN_CLASS_IDENTIFIER_FINALIZED,
TOKEN_CLASS_FUNC_MACRO,
TOKEN_CLASS_OBJ_MACRO
} token_class_t;