preprocessor/6386: Spurious "unterminated #if"

Neil Booth neil@daikokuya.demon.co.uk
Sun Apr 21 03:50:00 GMT 2002


Neil Booth wrote:-

> 	* cppmacro.c (funlike_invocation_p): Don't step back over CPP_EOF.
> testsuite:
> 	* gcc.dg/cpp/endif.h, gcc.dg/cpp/endif.c: New tests.
> 
> Index: cppmacro.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/cppmacro.c,v
> retrieving revision 1.98
> diff -u -p -r1.98 cppmacro.c
> --- cppmacro.c	14 Apr 2002 18:42:46 -0000	1.98
> +++ cppmacro.c	20 Apr 2002 22:04:19 -0000
> @@ -632,12 +632,15 @@ 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);
> +  if (token->type != CPP_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);
> +    }

Sadly, that wasn't quite enough.  This is the patch I've committed.

Neil.

Index: cppmacro.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cppmacro.c,v
retrieving revision 1.91.6.3
diff -u -p -r1.91.6.3 cppmacro.c
--- cppmacro.c	1 Apr 2002 21:16:43 -0000	1.91.6.3
+++ cppmacro.c	21 Apr 2002 10:47:48 -0000
@@ -646,12 +646,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;
 }



More information about the Gcc-patches mailing list