From de000d222aa7f081441b9d48eddff9301fc3d8b2 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 12 Oct 2006 11:25:59 +0200 Subject: [PATCH] re PR preprocessor/28709 (Bad diagnostic pasting tokens with ##) PR preprocessor/28709 * macro.c (paste_tokens): Do error reporting here, use BUF with the spelled LHS token as opposed to spelling it again. (paste_all_tokens): Don't report errors here, just break on failure. * gcc.dg/cpp/paste14.c: New test. From-SVN: r117664 --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/cpp/paste14.c | 7 ++++++ libcpp/ChangeLog | 7 ++++++ libcpp/macro.c | 35 +++++++++++++++--------------- 4 files changed, 37 insertions(+), 17 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/cpp/paste14.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3de03fb69c4..500edd2acf1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-10-12 Jakub Jelinek + + PR preprocessor/28709 + * gcc.dg/cpp/paste14.c: New test. + 2006-10-11 Mark Mitchell PR c++/29175 diff --git a/gcc/testsuite/gcc.dg/cpp/paste14.c b/gcc/testsuite/gcc.dg/cpp/paste14.c new file mode 100644 index 00000000000..ec243c2326f --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/paste14.c @@ -0,0 +1,7 @@ +/* PR preprocessor/28709 */ +/* { dg-do preprocess } */ + +#define foo - ## >> +foo /* { dg-error "pasting \"-\" and \">>\"" } */ +#define bar = ## == +bar /* { dg-error "pasting \"=\" and \"==\"" } */ diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 5871e954ee1..ae87e0ea92a 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,10 @@ +2006-10-12 Jakub Jelinek + + PR preprocessor/28709 + * macro.c (paste_tokens): Do error reporting here, use BUF with the + spelled LHS token as opposed to spelling it again. + (paste_all_tokens): Don't report errors here, just break on failure. + 2006-10-10 Brooks Moses * Makefile.in: Added empty "pdf" target. diff --git a/libcpp/macro.c b/libcpp/macro.c index b29f3a0c1fa..be50c111e32 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -430,15 +430,14 @@ stringify_arg (cpp_reader *pfile, macro_arg *arg) static bool paste_tokens (cpp_reader *pfile, const cpp_token **plhs, const cpp_token *rhs) { - unsigned char *buf, *end; + unsigned char *buf, *end, *lhsend; const cpp_token *lhs; unsigned int len; - bool valid; lhs = *plhs; len = cpp_token_len (lhs) + cpp_token_len (rhs) + 1; buf = (unsigned char *) alloca (len); - end = cpp_spell_token (pfile, lhs, buf, false); + end = lhsend = cpp_spell_token (pfile, lhs, buf, false); /* Avoid comment headers, since they are still processed in stage 3. It is simpler to insert a space here, rather than modifying the @@ -455,10 +454,22 @@ paste_tokens (cpp_reader *pfile, const cpp_token **plhs, const cpp_token *rhs) /* Set pfile->cur_token as required by _cpp_lex_direct. */ pfile->cur_token = _cpp_temp_token (pfile); *plhs = _cpp_lex_direct (pfile); - valid = pfile->buffer->cur == pfile->buffer->rlimit; - _cpp_pop_buffer (pfile); + if (pfile->buffer->cur != pfile->buffer->rlimit) + { + _cpp_pop_buffer (pfile); + _cpp_backup_tokens (pfile, 1); + *lhsend = '\0'; - return valid; + /* Mandatory error for all apart from assembler. */ + if (CPP_OPTION (pfile, lang) != CLK_ASM) + cpp_error (pfile, CPP_DL_ERROR, + "pasting \"%s\" and \"%s\" does not give a valid preprocessing token", + buf, cpp_token_as_text (pfile, rhs)); + return false; + } + + _cpp_pop_buffer (pfile); + return true; } /* Handles an arbitrarily long sequence of ## operators, with initial @@ -490,17 +501,7 @@ paste_all_tokens (cpp_reader *pfile, const cpp_token *lhs) abort (); if (!paste_tokens (pfile, &lhs, rhs)) - { - _cpp_backup_tokens (pfile, 1); - - /* Mandatory error for all apart from assembler. */ - if (CPP_OPTION (pfile, lang) != CLK_ASM) - cpp_error (pfile, CPP_DL_ERROR, - "pasting \"%s\" and \"%s\" does not give a valid preprocessing token", - cpp_token_as_text (pfile, lhs), - cpp_token_as_text (pfile, rhs)); - break; - } + break; } while (rhs->flags & PASTE_LEFT);