diff options
author | Tom Tromey <tromey@redhat.com> | 2007-11-01 18:20:48 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2007-11-01 18:20:48 +0000 |
commit | f373b44d282eca5e494f71ef2ad16f00b0ff1233 (patch) | |
tree | d2d010b50cd8299a7b0f4980f1321627be3431c2 /libcpp/macro.c | |
parent | 233a722b41e85a05c88390bea6764e93a1bf92ea (diff) | |
download | gcc-f373b44d282eca5e494f71ef2ad16f00b0ff1233.zip gcc-f373b44d282eca5e494f71ef2ad16f00b0ff1233.tar.gz gcc-f373b44d282eca5e494f71ef2ad16f00b0ff1233.tar.bz2 |
re PR preprocessor/30805 (Internal compiler error when using "x##,##__VA_ARGS__" in macro)
libcpp
PR preprocessor/30805:
* macro.c (paste_tokens): Handle padding token.
(paste_tokens): Don't abort unless padding has PASTE_LEFT flag.
gcc/testsuite
PR preprocessor/30805:
* gcc.dg/cpp/pr30805.c: New file.
From-SVN: r129827
Diffstat (limited to 'libcpp/macro.c')
-rw-r--r-- | libcpp/macro.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/libcpp/macro.c b/libcpp/macro.c index 50bb34d..f3a4420 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -451,7 +451,9 @@ paste_tokens (cpp_reader *pfile, const cpp_token **plhs, const cpp_token *rhs) false doesn't work, since we want to clear the PASTE_LEFT flag. */ if ((*plhs)->type == CPP_DIV && rhs->type != CPP_EQ) *end++ = ' '; - end = cpp_spell_token (pfile, rhs, end, false); + /* In one obscure case we might see padding here. */ + if (rhs->type != CPP_PADDING) + end = cpp_spell_token (pfile, rhs, end, false); *end = '\n'; cpp_push_buffer (pfile, buf, end - buf, /* from_stage3 */ true); @@ -514,8 +516,10 @@ paste_all_tokens (cpp_reader *pfile, const cpp_token *lhs) rhs = *FIRST (context).ptoken++; if (rhs->type == CPP_PADDING) - abort (); - + { + if (rhs->flags & PASTE_LEFT) + abort (); + } if (!paste_tokens (pfile, &lhs, rhs)) break; } |