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>
|
2007-05-23 Sandra Loosemore <sandra@codesourcery.com>
|
||||||
Nigel Stephens <nigel@mips.com>
|
Nigel Stephens <nigel@mips.com>
|
||||||
Richard Sandiford <richard@codesourcery.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>
|
2007-05-21 Ian Lance Taylor <iant@google.com>
|
||||||
|
|
||||||
* internal.h (struct cpp_reader): Add new fields:
|
* internal.h (struct cpp_reader): Add new fields:
|
||||||
|
|
|
@ -1434,6 +1434,9 @@ create_iso_definition (cpp_reader *pfile, cpp_macro *macro)
|
||||||
{
|
{
|
||||||
cpp_token *token;
|
cpp_token *token;
|
||||||
const cpp_token *ctoken;
|
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
|
/* Get the first token of the expansion (or the '(' of a
|
||||||
function-like macro). */
|
function-like macro). */
|
||||||
|
@ -1527,26 +1530,34 @@ create_iso_definition (cpp_reader *pfile, cpp_macro *macro)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (token->type == CPP_EOF)
|
if (token->type == CPP_EOF)
|
||||||
|
{
|
||||||
|
/* 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;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Paste operator constraint 6.10.3.3.1. */
|
/* Paste operator constraint 6.10.3.3.1. */
|
||||||
if (token->type == CPP_PASTE)
|
if (token->type == CPP_PASTE)
|
||||||
{
|
{
|
||||||
/* Token-paste ##, can appear in both object-like and
|
/* Token-paste ##, can appear in both object-like and
|
||||||
function-like macros, but not at the ends. */
|
function-like macros, but not at the beginning. */
|
||||||
if (--macro->count > 0)
|
if (macro->count == 1)
|
||||||
token = lex_expansion_token (pfile, macro);
|
|
||||||
|
|
||||||
if (macro->count == 0 || token->type == CPP_EOF)
|
|
||||||
{
|
{
|
||||||
cpp_error (pfile, CPP_DL_ERROR,
|
cpp_error (pfile, CPP_DL_ERROR, paste_op_error_msg);
|
||||||
"'##' cannot appear at either end of a macro expansion");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
--macro->count;
|
||||||
token[-1].flags |= PASTE_LEFT;
|
token[-1].flags |= PASTE_LEFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
following_paste_op = (token->type == CPP_PASTE);
|
||||||
token = lex_expansion_token (pfile, macro);
|
token = lex_expansion_token (pfile, macro);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue