[Bug preprocessor/100392] New: compiling result of "g++ -E -fdirectives-only" causes "error: stray ‘#’ in program" if no newline at EOF

mst.lo at arcor dot de gcc-bugzilla@gcc.gnu.org
Mon May 3 09:59:34 GMT 2021


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

            Bug ID: 100392
           Summary: compiling result of "g++ -E -fdirectives-only" causes
                    "error: stray ‘#’ in program" if no newline at EOF
           Product: gcc
           Version: 11.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: preprocessor
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mst.lo at arcor dot de
  Target Milestone: ---

> g++ --version
g++ (GCC) 11.1.1 20210428 (Red Hat 11.1.1-1)

works:

> echo '#include "test.h"' > test.cpp
> printf 'extern const int ksc5601_hangul_to_unicode[2350];\n' > test.h
> g++ -E -fdirectives-only test.cpp -o test.i
> g++ -c test.i

doesn't work:

> echo '#include "test.h"' > test.cpp
> printf 'extern const int ksc5601_hangul_to_unicode[2350];' > test.h
> g++ -E -fdirectives-only test.cpp -o test.i
> g++ -c test.i
In file included from test.cpp:1:
test.h:1:50: error: stray ‘#’ in program
    1 | extern const int ksc5601_hangul_to_unicode[2350];
      |                                                  ^
test.h:1:52: error: expected unqualified-id before numeric constant
    1 | extern const int ksc5601_hangul_to_unicode[2350];
      |      

in a draft of C++11, 2.2 Phases of translation [lex.phases] 1.2 says:

  A source file
  that is not empty and that does not end in a new-line character, or that ends
in a new-line character
  immediately preceded by a backslash character before any such splicing takes
place, shall be processed
  as if an additional new-line character were appended to the file.

similar language in
https://github.com/cplusplus/draft/blob/master/source/lex.tex#L97

wheres e.g. in a draft of C99, 5.1.1.2 Translation phases 2. says:

  A source file that is not empty shall end in a new-line character,
  which shall not be immediately preceded by a backslash character before any
such
  splicing takes place.

... so apparently different standards have different requirements here.

i believe this problem didn't occur when using GCC 10 with sccache or icecream,
which use "-E -fdirectives-only" to create a suitable input for distributed
compilation.


More information about the Gcc-bugs mailing list