diff options
author | simartin <simartin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-05-23 20:58:34 +0000 |
---|---|---|
committer | simartin <simartin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-05-23 20:58:34 +0000 |
commit | 3b6c638ead814ff8cb8e7311f2c717a1ec850f92 (patch) | |
tree | a044b3337600d63cb8999a4a4f4063b685f09fa7 /libcpp/macro.c | |
parent | 50b412cea73f91959a052c800f34b0c16461c243 (diff) | |
download | gcc-3b6c638ead814ff8cb8e7311f2c717a1ec850f92.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125000 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp/macro.c')
-rw-r--r-- | libcpp/macro.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/libcpp/macro.c b/libcpp/macro.c index 748635f408e..12681c34338 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -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); } |