Hi! If a header doesn't end with a new-line, with -fdirectives-only we right now preprocess it as int i = 1;# 2 "pr100392.c" 2 i.e. the line directive isn't on the next line, which means we fail to parse it when compiling.
GCC 10 and earlier libcpp/directives-only.c had for this: if (!pfile->state.skipping && cur != base) { /* If the file was not newline terminated, add rlimit, which is guaranteed to point to a newline, to the end of our range. */ if (cur[-1] != '\n') { cur++; CPP_INCREMENT_LINE (pfile, 0); lines++; } cb->print_lines (lines, base, cur - base); } and we have the assertion /* Files always end in a newline or carriage return. We rely on this for character peeking safety. */ gcc_assert (buffer->rlimit[0] == '\n' || buffer->rlimit[0] == '\r'); So, this patch just does readd the more less same thing, so that we emit a newline after the inline even when it wasn't there before. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/11.2? 2021-05-05 Jakub Jelinek <ja...@redhat.com> PR preprocessor/100392 * lex.c (cpp_directive_only_process): If buffer doesn't end with '\n', add buffer->rlimit[0] character to the printed range and CPP_INCREMENT_LINE and increment line_count. * gcc.dg/cpp/pr100392.c: New test. * gcc.dg/cpp/pr100392.h: New file. --- libcpp/lex.c.jj 2021-02-03 23:17:05.121659691 +0100 +++ libcpp/lex.c 2021-05-04 16:46:54.560272231 +0200 @@ -4756,7 +4756,18 @@ cpp_directive_only_process (cpp_reader * } if (buffer->rlimit > base && !pfile->state.skipping) - cb (pfile, CPP_DO_print, data, line_count, base, buffer->rlimit - base); + { + const unsigned char *limit = buffer->rlimit; + /* If the file was not newline terminated, add rlimit, which is + guaranteed to point to a newline, to the end of our range. */ + if (limit[-1] != '\n') + { + limit++; + CPP_INCREMENT_LINE (pfile, 0); + line_count++; + } + cb (pfile, CPP_DO_print, data, line_count, base, limit - base); + } _cpp_pop_buffer (pfile); } --- gcc/testsuite/gcc.dg/cpp/pr100392.c.jj 2021-05-04 16:50:17.491025563 +0200 +++ gcc/testsuite/gcc.dg/cpp/pr100392.c 2021-05-04 16:48:37.683130548 +0200 @@ -0,0 +1,5 @@ +/* PR preprocessor/100392 */ +/* { dg-do compile } */ +/* { dg-options "-save-temps -fdirectives-only" } */ + +#include "pr100392.h" --- gcc/testsuite/gcc.dg/cpp/pr100392.h.jj 2021-05-04 16:50:14.026063924 +0200 +++ gcc/testsuite/gcc.dg/cpp/pr100392.h 2021-05-04 16:50:05.969153124 +0200 @@ -0,0 +1,4 @@ +/* PR preprocessor/100392 */ + +/* No newline after ; below. */ +int i = 1; \ No newline at end of file Jakub