https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100392

--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:c6b664e2c4c127025e076d8b584abe0976694629

commit r12-748-gc6b664e2c4c127025e076d8b584abe0976694629
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Wed May 12 15:14:35 2021 +0200

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

Reply via email to