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.
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user