public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PR 95182] ICE with EOF in macro args
@ 2020-05-19 13:21 Nathan Sidwell
  0 siblings, 0 replies; only message in thread
From: Nathan Sidwell @ 2020-05-19 13:21 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 335 bytes --]

This was another latent case of us losing an EOF token, but succeeding 
anyway.  Since my patch to make us pay more attention to EOFs it came to 
light.  We also need to keep the EOF if we fall off the end of the main 
file.  Forced includes look like regular nested includes at this point.

pushed to trunk

nathan
-- 
Nathan Sidwell

[-- Attachment #2: pr95182.diff --]
[-- Type: text/x-patch, Size: 3447 bytes --]

2020-05-18  Nathan Sidwell  <nathan@acm.org>

	PR preprocessor/95182
	libcpp/
	* macro.c (collect_args): Preserve EOFif we fell out of the main
	file.
	(cpp_get_token_1): Reformat a couple of short lines.

diff --git c/libcpp/macro.c w/libcpp/macro.c
index dc4366ffefd..2c7d7322e09 100644
--- c/libcpp/macro.c
+++ w/libcpp/macro.c
@@ -1258,11 +1258,13 @@ collect_args (cpp_reader *pfile, const cpp_hashnode *node,
 
   if (token->type == CPP_EOF)
     {
-      /* We still need the CPP_EOF to end directives, and to end
-	 pre-expansion of a macro argument.  Step back is not
-	 unconditional, since we don't want to return a CPP_EOF to our
-	 callers at the end of an -include-d file.  */
-      if (pfile->context->prev || pfile->state.in_directive)
+      /* We still need the CPP_EOF to end directives, to end
+	 pre-expansion of a macro argument, and at the end of the main
+	 file.  We do not want it at the end of a -include'd (forced)
+	 header file.  */
+      if (pfile->state.in_directive
+	  || !pfile->line_table->depth
+	  || pfile->context->prev)
 	_cpp_backup_tokens (pfile, 1);
       cpp_error (pfile, CPP_DL_ERROR,
 		 "unterminated argument list invoking macro \"%s\"",
@@ -2870,8 +2872,7 @@ cpp_get_token_1 (cpp_reader *pfile, location_t *location)
 				      || (peek_tok->flags & PREV_WHITE));
 		  node = pfile->cb.macro_to_expand (pfile, result);
 		  if (node)
-		    ret = enter_macro_context (pfile, node, result,
-					       virt_loc);
+		    ret = enter_macro_context (pfile, node, result, virt_loc);
 		  else if (whitespace_after)
 		    {
 		      /* If macro_to_expand hook returned NULL and it
@@ -2888,8 +2889,7 @@ cpp_get_token_1 (cpp_reader *pfile, location_t *location)
 		}
 	    }
 	  else
-	    ret = enter_macro_context (pfile, node, result, 
-				       virt_loc);
+	    ret = enter_macro_context (pfile, node, result, virt_loc);
 	  if (ret)
  	    {
 	      if (pfile->state.in_directive || ret == 2)
diff --git c/gcc/testsuite/c-c++-common/cpp/eof-1.c w/gcc/testsuite/c-c++-common/cpp/eof-1.c
new file mode 100644
index 00000000000..0a06f091d93
--- /dev/null
+++ w/gcc/testsuite/c-c++-common/cpp/eof-1.c
@@ -0,0 +1,7 @@
+/* PR preprocess/95183  */
+
+/* { dg-do preprocess } */
+
+#define f(x) x
+
+f( /* { dg-error "-:unterminated" "unterminated macro" } */
diff --git c/gcc/testsuite/c-c++-common/cpp/eof-2.c w/gcc/testsuite/c-c++-common/cpp/eof-2.c
new file mode 100644
index 00000000000..3a4af7f6850
--- /dev/null
+++ w/gcc/testsuite/c-c++-common/cpp/eof-2.c
@@ -0,0 +1,8 @@
+/* PR preprocess/95183  */
+
+/* { dg-do preprocess } */
+
+#define f(x) x
+
+#include "eof-2.h"
+ /* { dg-regexp {[^\n]*eof-2.h:4: error: unterminated argument list invoking macro "f"\n} } */
diff --git c/gcc/testsuite/c-c++-common/cpp/eof-2.h w/gcc/testsuite/c-c++-common/cpp/eof-2.h
new file mode 100644
index 00000000000..48ad85791db
--- /dev/null
+++ w/gcc/testsuite/c-c++-common/cpp/eof-2.h
@@ -0,0 +1,4 @@
+
+#define f(x) x
+
+f( /* Error here  */
diff --git c/gcc/testsuite/c-c++-common/cpp/eof-3.c w/gcc/testsuite/c-c++-common/cpp/eof-3.c
new file mode 100644
index 00000000000..316918e3a6c
--- /dev/null
+++ w/gcc/testsuite/c-c++-common/cpp/eof-3.c
@@ -0,0 +1,8 @@
+/* PR preprocess/95183  */
+
+/* { dg-do preprocess } */
+/* { dg-additional-options "-include $srcdir/c-c++-common/cpp/eof-2.h" } */
+
+ /* { dg-regexp {[^\n]*eof-2.h:4: error: unterminated argument list invoking macro "f"\n} } */
+
+token )

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-05-19 13:21 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-19 13:21 [PR 95182] ICE with EOF in macro args Nathan Sidwell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).