diff --git a/gcc/testsuite/g++.dg/modules/pr99050_a.H b/gcc/testsuite/g++.dg/modules/pr99050_a.H new file mode 100644 index 00000000000..137e37f567f --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr99050_a.H @@ -0,0 +1,4 @@ +// PR c++/99050 ICE with directives only +// { dg-additional-options -fmodule-header } +// { dg-module-cmi {} } +void f (); diff --git a/gcc/testsuite/g++.dg/modules/pr99050_b.C b/gcc/testsuite/g++.dg/modules/pr99050_b.C new file mode 100644 index 00000000000..439e216eb16 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/pr99050_b.C @@ -0,0 +1,7 @@ +// { dg-do preprocess } +// { dg-additional-options {-fdirectives-only -fmodules-ts} } +#include "pr99050_a.H" + +int main () {} + +// { dg-final { scan-file pr99050_b.i {import "[^\n]*99050_a.H" \[\[__translated\]\];\n} } } diff --git a/libcpp/files.c b/libcpp/files.c index 5ea3f8e1bf3..3a35f7c9743 100644 --- a/libcpp/files.c +++ b/libcpp/files.c @@ -918,13 +918,17 @@ _cpp_stack_file (cpp_reader *pfile, _cpp_file *file, include_type type, because we don't usually need that location (we're popping an include file). However in this case we do want to do the increment. So push a writable buffer of two newlines to acheive - that. */ - static uchar newlines[] = "\n\n"; + 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); + size_t len = strlen (buf); + buf[len] = '\n'; /* See above */ cpp_buffer *buffer = cpp_push_buffer (pfile, reinterpret_cast (buf), - strlen (buf), true); + len, true); buffer->to_free = buffer->buf; file->header_unit = +1;