[pushed] libcpp: modules and -include again

Message ID 20241127044522.3073603-1-jason@redhat.com
State New
Headers
Series [pushed] libcpp: modules and -include again |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply

Commit Message

Jason Merrill Nov. 27, 2024, 4:44 a.m. UTC
  Tested x86_64-pc-linux-gnu, applying to trunk.

-- 8< --

I enabled include translation to header units in r15-1104-ga29f481bbcaf2b,
but it seems that patch wasn't sufficient, as any diagnostics in the main
source file would show up as coming from the header instead.

Fixed by setting buffer->file for leaving the file transition that my
previous patch made us enter.  And don't push a buffer of newlines, in this
case that messes up line numbers instead of aligning them.

libcpp/ChangeLog:

	* files.cc (_cpp_stack_file): Handle -include of header unit more
	specially.

gcc/testsuite/ChangeLog:

	* g++.dg/modules/dashinclude-1_b.C: Add an #error.
	* g++.dg/modules/dashinclude-1_a.H: Remove dg-module-do run.
---
 gcc/testsuite/g++.dg/modules/dashinclude-1_b.C |  2 ++
 libcpp/files.cc                                | 10 ++++++++--
 gcc/testsuite/g++.dg/modules/dashinclude-1_a.H |  1 -
 3 files changed, 10 insertions(+), 3 deletions(-)


base-commit: 819f67a2f633d2000f09119f0e19b784ea0a4bd8
  

Patch

diff --git a/gcc/testsuite/g++.dg/modules/dashinclude-1_b.C b/gcc/testsuite/g++.dg/modules/dashinclude-1_b.C
index 6e6a33407a4..f257a1d658e 100644
--- a/gcc/testsuite/g++.dg/modules/dashinclude-1_b.C
+++ b/gcc/testsuite/g++.dg/modules/dashinclude-1_b.C
@@ -6,4 +6,6 @@  int main ()
   return f();
 }
 
+#error foo			// { dg-error "foo" }
+
 // { dg-final { scan-lang-dump {Translating include to import} module } }
diff --git a/libcpp/files.cc b/libcpp/files.cc
index 1cbce4947ee..a60fe1fb6ea 100644
--- a/libcpp/files.cc
+++ b/libcpp/files.cc
@@ -977,8 +977,11 @@  _cpp_stack_file (cpp_reader *pfile, _cpp_file *file, include_type type,
 	 that.  (We also need an extra newline, so this looks like a regular
 	 file, which we do that to to make sure we don't fall off the end in the
 	 middle of a line.  */
-      static uchar newlines[] = "\n\n\n";
-      cpp_push_buffer (pfile, newlines, 2, true);
+      if (type != IT_CMDLINE)
+	{
+	  static uchar newlines[] = "\n\n\n";
+	  cpp_push_buffer (pfile, newlines, 2, true);
+	}
 
       size_t len = strlen (buf);
       buf[len] = '\n'; /* See above  */
@@ -986,6 +989,9 @@  _cpp_stack_file (cpp_reader *pfile, _cpp_file *file, include_type type,
 	= cpp_push_buffer (pfile, reinterpret_cast<unsigned char *> (buf),
 			   len, true);
       buffer->to_free = buffer->buf;
+      if (type == IT_CMDLINE)
+	/* Tell _cpp_pop_buffer to change files.  */
+	buffer->file = file;
 
       file->header_unit = +1;
       _cpp_mark_file_once_only (pfile, file);
diff --git a/gcc/testsuite/g++.dg/modules/dashinclude-1_a.H b/gcc/testsuite/g++.dg/modules/dashinclude-1_a.H
index c1b40a53924..82ee340798f 100644
--- a/gcc/testsuite/g++.dg/modules/dashinclude-1_a.H
+++ b/gcc/testsuite/g++.dg/modules/dashinclude-1_a.H
@@ -1,4 +1,3 @@ 
-// { dg-module-do run }
 // { dg-additional-options "-fmodule-header" }
 // { dg-module-cmi {} }