cpplex.c (ON_REST_ARG): Check VAR_ARGS flag of current context, use posn - 1 to index...
authorJakub Jelinek <jakub@redhat.com>
Mon, 4 Sep 2000 07:51:58 +0000 (09:51 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 4 Sep 2000 07:51:58 +0000 (09:51 +0200)
* cpplex.c (ON_REST_ARG): Check VAR_ARGS flag of current context,
use posn - 1 to index into tokens array.
(maybe_paste_with_next): Adjust caller.

* gcc.dg/cpp/paste8.c: New test.

From-SVN: r36128

gcc/ChangeLog
gcc/cpplex.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/paste8.c [new file with mode: 0644]

index 6d6474de515fba852a576c8f3ed43235718b9524..2e23d6ed45b3ae3716ff3dc494accbc41801ee6b 100644 (file)
@@ -1,3 +1,9 @@
+2000-09-04  Jakub Jelinek  <jakub@redhat.com>
+
+       * cpplex.c (ON_REST_ARG): Check VAR_ARGS flag of current context,
+       use posn - 1 to index into tokens array.
+       (maybe_paste_with_next): Adjust caller.
+
 2000-09-03  Geoff Keating  <geoffk@cygnus.com>
 
        * invoke.texi: Document the -mvxworks option for rs6000 ELF.
index 37d1de8c4408e7e4e01a610b44498a2addc692f3..ab5a987d9722d7fe70110850269c7dc4a52ac366 100644 (file)
@@ -202,8 +202,8 @@ TOKEN_LEN (token)
 #define CURRENT_CONTEXT(pfile) ((pfile)->contexts + (pfile)->cur_context)
 #define ON_REST_ARG(c) \
  (((c)->flags & VAR_ARGS) \
-  && (c)->u.list->tokens[(c)->posn].val.aux \
-      == (unsigned int) ((c)->u.list->paramc - 1))
+  && ((c)-1)->u.list->tokens[((c)-1)->posn - 1].val.aux \
+      == (unsigned int) (((c)-1)->u.list->paramc - 1))
 
 #define ASSIGN_FLAGS_AND_POS(d, s) \
   do {(d)->flags = (s)->flags & (PREV_WHITE | BOL | PASTE_LEFT); \
@@ -2773,7 +2773,7 @@ maybe_paste_with_next (pfile, token)
                     the special extended semantics (see above).  */
                  if (token->type == CPP_COMMA
                      && IS_ARG_CONTEXT (CURRENT_CONTEXT (pfile))
-                     && ON_REST_ARG (CURRENT_CONTEXT (pfile) - 1))
+                     && ON_REST_ARG (CURRENT_CONTEXT (pfile)))
                    /* no warning */;
                  else
                    cpp_warning (pfile,
index 58e1aea0e0ab0f75ae25e25929c78c3d3257802f..202ad8f48b9c7c48c948fbc8a14347a2558fdfa8 100644 (file)
@@ -1,3 +1,7 @@
+2000-09-04  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.dg/cpp/paste8.c: New test.
+
 2000-09-01  Alexandre Oliva  <aoliva@redhat.com>
 
        * gcc.c-torture/compile/20000827-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/cpp/paste8.c b/gcc/testsuite/gcc.dg/cpp/paste8.c
new file mode 100644 (file)
index 0000000..dc5fe83
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do preprocess } */
+/* { dg-options "" } */
+
+int foo(int, ...);
+
+#define a(x, y...) foo(x, ##y)
+a(1)
+a(1, 2, 3)
+#define b(x, y, z...) foo(x, ##y)
+b(1, 2, 3)                             /* { dg-warning "pasting would not" } */
+#define c(x, y, z...) foo(x, ##z)
+c(1, 2)
+c(1, 2, 3)
+#define d(x) foo(##x)                  /* { dg-warning "nothing can be pasted" } */
+d(1)