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
This commit is contained in:
parent
b6fa5b0101
commit
aa50850225
8 changed files with 615 additions and 12 deletions
|
@ -178,6 +178,10 @@ struct cpp_string GTY(())
|
|||
#define BOL (1 << 6) /* Token at beginning of line. */
|
||||
#define PURE_ZERO (1 << 7) /* Single 0 digit, used by the C++ frontend,
|
||||
set in c-lex.c. */
|
||||
#define SP_DIGRAPH (1 << 8) /* # or ## token was a digraph. */
|
||||
#define SP_PREV_WHITE (1 << 9) /* If whitespace before a ##
|
||||
operator, or before this token
|
||||
after a # operator. */
|
||||
|
||||
/* Specify which field, if any, of the cpp_token union is used. */
|
||||
|
||||
|
@ -196,7 +200,7 @@ struct cpp_token GTY(())
|
|||
{
|
||||
source_location src_loc; /* Location of first char of token. */
|
||||
ENUM_BITFIELD(cpp_ttype) type : CHAR_BIT; /* token type */
|
||||
unsigned char flags; /* flags - see above */
|
||||
unsigned short flags; /* flags - see above */
|
||||
|
||||
union cpp_token_u
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue