re PR preprocessor/20077 (GCC accepts macro definitions that fail a constraint)
2007-05-23 Simon Martin <simartin@users.sourceforge.net> PR preprocessor/20077 * macro.c (create_iso_definition): Fixed the method to determine whether the token-pasting operator appears at the beginning or the end of a macro. From-SVN: r125000
This commit is contained in:
parent
a38e0142a8
commit
126e073b22
4 changed files with 46 additions and 8 deletions
|
@ -1,3 +1,8 @@
|
|||
2007-05-23 Simon Martin <simartin@users.sourceforge.net>
|
||||
|
||||
PR preprocessor/20077
|
||||
* gcc.dg/cpp/paste15.c: New test.
|
||||
|
||||
2007-05-23 Sandra Loosemore <sandra@codesourcery.com>
|
||||
Nigel Stephens <nigel@mips.com>
|
||||
Richard Sandiford <richard@codesourcery.com>
|
||||
|
|
15
gcc/testsuite/gcc.dg/cpp/paste15.c
Normal file
15
gcc/testsuite/gcc.dg/cpp/paste15.c
Normal file
|
@ -0,0 +1,15 @@
|
|||
/* PR preprocessor/20077 */
|
||||
/* { dg-do preprocess } */
|
||||
|
||||
#define a a ## ## /* { dg-error "end of a macro expansion" } */
|
||||
#define b() b ## ## /* { dg-error "end of a macro expansion" } */
|
||||
#define c c ## /* { dg-error "end of a macro expansion" } */
|
||||
#define d() d ## /* { dg-error "end of a macro expansion" } */
|
||||
|
||||
|
||||
#define e ## ## e /* { dg-error "end of a macro expansion" } */
|
||||
#define f() ## ## f /* { dg-error "end of a macro expansion" } */
|
||||
#define g ## g /* { dg-error "end of a macro expansion" } */
|
||||
#define h() ## h /* { dg-error "end of a macro expansion" } */
|
||||
#define i ## /* { dg-error "end of a macro expansion" } */
|
||||
#define j() ## /* { dg-error "end of a macro expansion" } */
|
|
@ -1,3 +1,10 @@
|
|||
2007-05-23 Simon Martin <simartin@users.sourceforge.net>
|
||||
|
||||
PR preprocessor/20077
|
||||
* macro.c (create_iso_definition): Fixed the method to determine
|
||||
whether the token-pasting operator appears at the beginning or the end
|
||||
of a macro.
|
||||
|
||||
2007-05-21 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* internal.h (struct cpp_reader): Add new fields:
|
||||
|
|
|
@ -1434,6 +1434,9 @@ create_iso_definition (cpp_reader *pfile, cpp_macro *macro)
|
|||
{
|
||||
cpp_token *token;
|
||||
const cpp_token *ctoken;
|
||||
bool following_paste_op = false;
|
||||
const char *paste_op_error_msg =
|
||||
N_("'##' cannot appear at either end of a macro expansion");
|
||||
|
||||
/* Get the first token of the expansion (or the '(' of a
|
||||
function-like macro). */
|
||||
|
@ -1527,26 +1530,34 @@ create_iso_definition (cpp_reader *pfile, cpp_macro *macro)
|
|||
}
|
||||
|
||||
if (token->type == CPP_EOF)
|
||||
break;
|
||||
{
|
||||
/* Paste operator constraint 6.10.3.3.1:
|
||||
Token-paste ##, can appear in both object-like and
|
||||
function-like macros, but not at the end. */
|
||||
if (following_paste_op)
|
||||
{
|
||||
cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* Paste operator constraint 6.10.3.3.1. */
|
||||
if (token->type == CPP_PASTE)
|
||||
{
|
||||
/* Token-paste ##, can appear in both object-like and
|
||||
function-like macros, but not at the ends. */
|
||||
if (--macro->count > 0)
|
||||
token = lex_expansion_token (pfile, macro);
|
||||
|
||||
if (macro->count == 0 || token->type == CPP_EOF)
|
||||
function-like macros, but not at the beginning. */
|
||||
if (macro->count == 1)
|
||||
{
|
||||
cpp_error (pfile, CPP_DL_ERROR,
|
||||
"'##' cannot appear at either end of a macro expansion");
|
||||
cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
|
||||
return false;
|
||||
}
|
||||
|
||||
--macro->count;
|
||||
token[-1].flags |= PASTE_LEFT;
|
||||
}
|
||||
|
||||
following_paste_op = (token->type == CPP_PASTE);
|
||||
token = lex_expansion_token (pfile, macro);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue