diff options
author | Joseph Myers <joseph@codesourcery.com> | 2009-04-19 18:10:56 +0100 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2009-04-19 18:10:56 +0100 |
commit | aa50850225d70521ace3948a8e5858425a918f6a (patch) | |
tree | 311d607f4a7b5f177b00f2193802a219b80ccc5e /libcpp/lex.c | |
parent | b6fa5b01018ac42682f8d69fff9e48f50b87c910 (diff) | |
download | gcc-aa50850225d70521ace3948a8e5858425a918f6a.zip gcc-aa50850225d70521ace3948a8e5858425a918f6a.tar.gz gcc-aa50850225d70521ace3948a8e5858425a918f6a.tar.bz2 |
re PR preprocessor/20078 (Gcc doesn't complain about non-benign macro definitions)
libcpp:
PR preprocessor/20078
* include/cpp-id-data.h (struct cpp_macro): Add extra_tokens
field.
* include/cpplib.h (SP_DIGRAPH, SP_PREV_WHITE): Define.
(struct cpp_token): Change flags to unsigned short.
* lex.c (_cpp_lex_direct): Initialize arg_no for CPP_PASTE tokens.
(_cpp_equiv_tokens): Check arg_no for CPP_PASTE tokens.
(cpp_token_val_index): Return CPP_TOKEN_FLD_ARG_NO for CPP_PASTE
tokens.
* macro.c (macro_real_token_count): New.
(enter_macro_context, replace_args): Use macro_real_token_count.
(create_iso_definition): Record whitespace surrounding and digraph
spelling of # and ## tokens using SP_PREV_WHITE and SP_DIGRAPH.
Set extra_tokens and save CPP_PASTE tokens with arg_no set for
multiple consecutive ## tokens.
(_cpp_create_definition): Initialize extra_tokens.
(cpp_macro_definition): Use macro_real_token_count.
gcc/testsuite:
* gcc.dg/cpp/paste16.c, gcc.dg/cpp/redef4.c: New tests.
From-SVN: r146352
Diffstat (limited to 'libcpp/lex.c')
-rw-r--r-- | libcpp/lex.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/libcpp/lex.c b/libcpp/lex.c index 0a3a6bc..63e291c 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -1244,7 +1244,7 @@ _cpp_lex_direct (cpp_reader *pfile) result->flags |= DIGRAPH; result->type = CPP_HASH; if (*buffer->cur == '%' && buffer->cur[1] == ':') - buffer->cur += 2, result->type = CPP_PASTE; + buffer->cur += 2, result->type = CPP_PASTE, result->val.arg_no = 0; } else if (*buffer->cur == '>') { @@ -1325,7 +1325,7 @@ _cpp_lex_direct (cpp_reader *pfile) case '=': IF_NEXT_IS ('=', CPP_EQ_EQ, CPP_EQ); break; case '!': IF_NEXT_IS ('=', CPP_NOT_EQ, CPP_NOT); break; case '^': IF_NEXT_IS ('=', CPP_XOR_EQ, CPP_XOR); break; - case '#': IF_NEXT_IS ('#', CPP_PASTE, CPP_HASH); break; + case '#': IF_NEXT_IS ('#', CPP_PASTE, CPP_HASH); result->val.arg_no = 0; break; case '?': result->type = CPP_QUERY; break; case '~': result->type = CPP_COMPL; break; @@ -1572,7 +1572,9 @@ _cpp_equiv_tokens (const cpp_token *a, const cpp_token *b) { default: /* Keep compiler happy. */ case SPELL_OPERATOR: - return 1; + /* arg_no is used to track where multiple consecutive ## + tokens were originally located. */ + return (a->type != CPP_PASTE || a->val.arg_no == b->val.arg_no); case SPELL_NONE: return (a->type != CPP_MACRO_ARG || a->val.arg_no == b->val.arg_no); case SPELL_IDENT: @@ -1886,6 +1888,11 @@ cpp_token_val_index (cpp_token *tok) return CPP_TOKEN_FLD_NODE; case SPELL_LITERAL: return CPP_TOKEN_FLD_STR; + case SPELL_OPERATOR: + if (tok->type == CPP_PASTE) + return CPP_TOKEN_FLD_ARG_NO; + else + return CPP_TOKEN_FLD_NONE; case SPELL_NONE: if (tok->type == CPP_MACRO_ARG) return CPP_TOKEN_FLD_ARG_NO; |