c++: directives-only preprocessing and include translation [PR 99050]

We make sure files end in \n by placing one at the limit of the buffer
(just past the end of what is read).  We need to do the same for
buffers generated via include-translation.  Fortunately they have
space.

	libcpp/
	* files.c (_cpp_stack_file): Make buffers end in unread \n.
	gcc/testsuite/
	* g++.dg/modules/pr99050_a.H: New.
	* g++.dg/modules/pr99050_b.C: New.
This commit is contained in:
Nathan Sidwell 2021-02-16 12:23:12 -08:00
parent 30a4d95bf7
commit b37695c9bf
3 changed files with 18 additions and 3 deletions

View File

@ -0,0 +1,4 @@
// PR c++/99050 ICE with directives only
// { dg-additional-options -fmodule-header }
// { dg-module-cmi {} }
void f ();

View File

@ -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} } }

View File

@ -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<unsigned char *> (buf),
strlen (buf), true);
len, true);
buffer->to_free = buffer->buf;
file->header_unit = +1;