libcpp: Fix up -fdirectives-only preprocessing of includes not ending with newline [PR100392]
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. 2021-05-12 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.
This commit is contained in:
parent
fc186594e3
commit
c6b664e2c4
5
gcc/testsuite/gcc.dg/cpp/pr100392.c
Normal file
5
gcc/testsuite/gcc.dg/cpp/pr100392.c
Normal file
@ -0,0 +1,5 @@
|
||||
/* PR preprocessor/100392 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-save-temps -fdirectives-only" } */
|
||||
|
||||
#include "pr100392.h"
|
4
gcc/testsuite/gcc.dg/cpp/pr100392.h
Normal file
4
gcc/testsuite/gcc.dg/cpp/pr100392.h
Normal file
@ -0,0 +1,4 @@
|
||||
/* PR preprocessor/100392 */
|
||||
|
||||
/* No newline after ; below. */
|
||||
int i = 1;
|
13
libcpp/lex.c
13
libcpp/lex.c
@ -4768,7 +4768,18 @@ cpp_directive_only_process (cpp_reader *pfile,
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user