* [PATCH] libcpp: Fix up -fdirectives-only preprocessing of includes not ending with newline [PR100392]
@ 2021-05-05 8:41 Jakub Jelinek
0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2021-05-05 8:41 UTC (permalink / raw)
To: Nathan Sidwell, Jason Merrill, Joseph S. Myers, Marek Polacek,
David Malcolm
Cc: gcc-patches
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 <jakub@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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2021-05-05 8:42 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-05 8:41 [PATCH] libcpp: Fix up -fdirectives-only preprocessing of includes not ending with newline [PR100392] Jakub Jelinek
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).