diff mbox series

libcpp: Fix up -fdirectives-only preprocessing of includes not ending with newline [PR100392]

Message ID 20210505084150.GM1179226@tucnak
State New
Headers show
Series libcpp: Fix up -fdirectives-only preprocessing of includes not ending with newline [PR100392] | expand

Commit Message

Jakub Jelinek May 5, 2021, 8:41 a.m. UTC
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.


	Jakub
diff mbox series

Patch

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