mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-13 08:49:57 +08:00
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
This commit is contained in:
parent
1e96b1c34f
commit
de000d222a
@ -1,3 +1,8 @@
|
|||||||
|
2006-10-12 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR preprocessor/28709
|
||||||
|
* gcc.dg/cpp/paste14.c: New test.
|
||||||
|
|
||||||
2006-10-11 Mark Mitchell <mark@codesourcery.com>
|
2006-10-11 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
PR c++/29175
|
PR c++/29175
|
||||||
|
7
gcc/testsuite/gcc.dg/cpp/paste14.c
Normal file
7
gcc/testsuite/gcc.dg/cpp/paste14.c
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
/* PR preprocessor/28709 */
|
||||||
|
/* { dg-do preprocess } */
|
||||||
|
|
||||||
|
#define foo - ## >>
|
||||||
|
foo /* { dg-error "pasting \"-\" and \">>\"" } */
|
||||||
|
#define bar = ## ==
|
||||||
|
bar /* { dg-error "pasting \"=\" and \"==\"" } */
|
@ -1,3 +1,10 @@
|
|||||||
|
2006-10-12 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
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 <bmoses@stanford.edu>
|
2006-10-10 Brooks Moses <bmoses@stanford.edu>
|
||||||
|
|
||||||
* Makefile.in: Added empty "pdf" target.
|
* Makefile.in: Added empty "pdf" target.
|
||||||
|
@ -430,15 +430,14 @@ stringify_arg (cpp_reader *pfile, macro_arg *arg)
|
|||||||
static bool
|
static bool
|
||||||
paste_tokens (cpp_reader *pfile, const cpp_token **plhs, const cpp_token *rhs)
|
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;
|
const cpp_token *lhs;
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
bool valid;
|
|
||||||
|
|
||||||
lhs = *plhs;
|
lhs = *plhs;
|
||||||
len = cpp_token_len (lhs) + cpp_token_len (rhs) + 1;
|
len = cpp_token_len (lhs) + cpp_token_len (rhs) + 1;
|
||||||
buf = (unsigned char *) alloca (len);
|
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.
|
/* Avoid comment headers, since they are still processed in stage 3.
|
||||||
It is simpler to insert a space here, rather than modifying the
|
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. */
|
/* Set pfile->cur_token as required by _cpp_lex_direct. */
|
||||||
pfile->cur_token = _cpp_temp_token (pfile);
|
pfile->cur_token = _cpp_temp_token (pfile);
|
||||||
*plhs = _cpp_lex_direct (pfile);
|
*plhs = _cpp_lex_direct (pfile);
|
||||||
valid = pfile->buffer->cur == pfile->buffer->rlimit;
|
if (pfile->buffer->cur != pfile->buffer->rlimit)
|
||||||
_cpp_pop_buffer (pfile);
|
{
|
||||||
|
_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
|
/* Handles an arbitrarily long sequence of ## operators, with initial
|
||||||
@ -490,17 +501,7 @@ paste_all_tokens (cpp_reader *pfile, const cpp_token *lhs)
|
|||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
if (!paste_tokens (pfile, &lhs, rhs))
|
if (!paste_tokens (pfile, &lhs, rhs))
|
||||||
{
|
break;
|
||||||
_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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
while (rhs->flags & PASTE_LEFT);
|
while (rhs->flags & PASTE_LEFT);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user