OSDN Git Service

* cppmacro.c (funlike_invocation_p): Don't step back over CPP_EOF.
authorneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 21 Apr 2002 16:17:55 +0000 (16:17 +0000)
committerneil <neil@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 21 Apr 2002 16:17:55 +0000 (16:17 +0000)
testsuite:
* gcc.dg/cpp/endif.h, gcc.dg/cpp/endif.c: New tests.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52586 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cppmacro.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/endif.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/cpp/endif.h [new file with mode: 0644]

index db431d1..f7a6c68 100644 (file)
@@ -1,3 +1,8 @@
+2002-04-21  Neil Booth  <neil@daikokuya.demon.co.uk>
+
+       * cppmacro.c (funlike_invocation_p): Don't step back
+       over CPP_EOF.
+
 2002-04-21  David Edelsohn  <edelsohn@gnu.org>
 
        * config/rs6000/rs6000.c (output_profile_hook): Do not increment
index 2070851..d39bd45 100644 (file)
@@ -632,12 +632,17 @@ funlike_invocation_p (pfile, node)
       return collect_args (pfile, node);
     }
 
-  /* Back up.  We may have skipped padding, in which case backing up
-     more than one token when expanding macros is in general too
-     difficult.  We re-insert it in its own context.  */
-  _cpp_backup_tokens (pfile, 1);
-  if (padding)
-    push_token_context (pfile, NULL, padding, 1);
+  /* CPP_EOF can be the end of macro arguments, or the end of the
+     file.  We mustn't back up over the latter.  Ugh.  */
+  if (token->type != CPP_EOF || token == &pfile->eof)
+    {
+      /* Back up.  We may have skipped padding, in which case backing
+        up more than one token when expanding macros is in general
+        too difficult.  We re-insert it in its own context.  */
+      _cpp_backup_tokens (pfile, 1);
+      if (padding)
+       push_token_context (pfile, NULL, padding, 1);
+    }
 
   return NULL;
 }
index 2d2c534..8c5385f 100644 (file)
@@ -1,3 +1,7 @@
+2002-04-21  Neil Booth  <neil@daikokuya.demon.co.uk>
+
+       * gcc.dg/cpp/endif.h, gcc.dg/cpp/endif.c: New tests.
+
 2002-04-21  Franz Sirl  <Franz.Sirl-kernel@lauterbach.com>
 
        * gcc.c-torture/execute/20000906-1.x: Delete.
diff --git a/gcc/testsuite/gcc.dg/cpp/endif.c b/gcc/testsuite/gcc.dg/cpp/endif.c
new file mode 100644 (file)
index 0000000..efea52c
--- /dev/null
@@ -0,0 +1,14 @@
+/* Copyright (C) 2002 Free Software Foundation, Inc.  */
+
+/* { dg-do preprocess } */
+
+/* Test case for PR preprocessor/6386 by Andreas Schwab.  We'd back up
+   over the CPP_EOF token (indicating not a funlike macro invocation)
+   in the header file, which would then be passed through as a real
+   EOF, leading to an early exit (and therefore bogus complaint about
+   unterminated #if).  */
+
+#define S(x)
+#if 1
+#include "endif.h"
+#endif
diff --git a/gcc/testsuite/gcc.dg/cpp/endif.h b/gcc/testsuite/gcc.dg/cpp/endif.h
new file mode 100644 (file)
index 0000000..3762249
--- /dev/null
@@ -0,0 +1 @@
+S