re PR preprocessor/30805 (Internal compiler error when using "x##,##__VA_ARGS__"...
authorTom Tromey <tromey@redhat.com>
Thu, 1 Nov 2007 18:20:48 +0000 (18:20 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Thu, 1 Nov 2007 18:20:48 +0000 (18:20 +0000)
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
gcc/testsuite/gcc.dg/cpp/pr30805.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/macro.c

index 8c564151917b14ffe81c35d98c7f7c4336b662cc..3d35ba060bdb47a2363cf0b6aab5da87d2e07c44 100644 (file)
@@ -1,3 +1,8 @@
+2007-11-01  Tom Tromey  <tromey@redhat.com>
+
+       PR preprocessor/30805:
+       * gcc.dg/cpp/pr30805.c: New file.
+
 2007-11-01  Janis Johnson  <janis187@us.ibm.com>
 
        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 (file)
index 0000000..4f56a76
--- /dev/null
@@ -0,0 +1,5 @@
+/* PR preprocessor/30805 - ICE while token pasting.  */
+/* { dg-do preprocess } */
+
+#define A(x,...) x##,##__VA_ARGS__
+A(1)
index beed40746faa4258b0acff8a8531ad81933d9850..c7cfa174709c3cd5dd881a5e8bc78ff1c1ab5731 100644 (file)
@@ -1,3 +1,9 @@
+2007-11-01  Tom Tromey  <tromey@redhat.com>
+
+       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  <tromey@redhat.com>
 
        PR preprocessor/30786:
index 50bb34ded5f86fe4338147ff0e8478b64f577a56..f3a4420ae406ac7bc4f47708f0526cb4ec1090b2 100644 (file)
@@ -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;
     }