From f373b44d282eca5e494f71ef2ad16f00b0ff1233 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 1 Nov 2007 18:20:48 +0000 Subject: [PATCH] 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 --- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/cpp/pr30805.c | 5 +++++ libcpp/ChangeLog | 6 ++++++ libcpp/macro.c | 10 +++++++--- 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/cpp/pr30805.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8c564151917..3d35ba060bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-11-01 Tom Tromey + + PR preprocessor/30805: + * gcc.dg/cpp/pr30805.c: New file. + 2007-11-01 Janis Johnson PR testsuite/25352 diff --git a/gcc/testsuite/gcc.dg/cpp/pr30805.c b/gcc/testsuite/gcc.dg/cpp/pr30805.c new file mode 100644 index 00000000000..4f56a767ac2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/pr30805.c @@ -0,0 +1,5 @@ +/* PR preprocessor/30805 - ICE while token pasting. */ +/* { dg-do preprocess } */ + +#define A(x,...) x##,##__VA_ARGS__ +A(1) diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index beed40746fa..c7cfa174709 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,9 @@ +2007-11-01 Tom Tromey + + PR preprocessor/30805: + * macro.c (paste_tokens): Handle padding token. + (paste_tokens): Don't abort unless padding has PASTE_LEFT flag. + 2007-10-31 Tom Tromey PR preprocessor/30786: diff --git a/libcpp/macro.c b/libcpp/macro.c index 50bb34ded5f..f3a4420ae40 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; } -- 2.30.2