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:
Simon Martin 2007-05-23 20:58:34 +00:00 committed by Simon Martin
parent a38e0142a8
commit 126e073b22
4 changed files with 46 additions and 8 deletions

View file

@ -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);
}