* cpplib.h (TTYPE_TABLE): Rearrange to use only two per-entry macros, not five. * cpphash.h (TOKEN_NAME): New macro. (_cpp_spell_operator): Deleted. (token_spellings): Now _cpp_token_spellings. * cppexp.c: Use TOKEN_NAME or TYPE_NAME, not _cpp_spell_operator. * cpplex.c: Use OP and TK macros when expanding the TTYPE_TABLE. Eliminate token_names. For non-OPERATOR tokens, store the stringification of the enumeration name (CPP_CHAR, etc.) in the name slot of token_spellings. Use TOKEN_NAME and/or TOKEN_SPELL, do not reference token_spellings directly. * cpplib.c: Use TOKEN_SPELL. * cpplex.c (_cpp_push_token): If the token being pushed back is the previous token in this context, just subtract one from context->posn. * cppmacro.c (save_expansion): Clear aux field when storing a placemarker. * gcc.dg/cpp/paste5.c: New test. * gcc.dg/cpp/vararg1.c: New test. From-SVN: r35124
25 lines
692 B
C
25 lines
692 B
C
/* Regression test for bug in convoluted situation involving token paste
|
|
plus function-like macros used outside function context. It may be
|
|
easier to understand if you mentally replace 'struct' with 'A'
|
|
throughout this file; 'struct' is used only to get the code to compile
|
|
when preprocessed correctly.
|
|
|
|
The original problem was seen in the Linux kernel and reported by
|
|
Jakub Jelinek <jakub@redhat.com>; this test is synthetic. */
|
|
|
|
/* { dg-do compile } */
|
|
|
|
#define glue(a,b) a##b
|
|
#define struct(x) B(x)
|
|
#define E(x) struct x
|
|
#define FG (22)
|
|
|
|
extern void B(int);
|
|
|
|
void foo(void)
|
|
{
|
|
E(glue(F,*)) dummy; /* { dg-warning "valid preprocessing token" } */
|
|
|
|
E(glue(F,G)) ;
|
|
}
|