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

            Bug ID: 80005
           Summary: cpp expands __has_include() filename parts
           Product: gcc
           Version: 6.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: preprocessor
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tim+gcc-bugzilla at centricular dot com
  Target Milestone: ---

gcc (Debian 6.3.0-4) 6.3.0 20170121
cpp (Debian 6.3.0-4) 6.3.0 20170121
Also happens with latest gcc7 snapshot on https://gcc.godbolt.org/

Linux 4.9.0-1-amd64 #1 SMP Debian 4.9.2-2 (2017-01-12) x86_64 GNU/Linux

I believe this is a gcc preprocessor bug. It works fine with clang fwiw.


1) Precondition:

/usr/include/linux/memfd.h exists (it does).


2) Source code to reproduce:

----------------------------------------------------
#ifdef __has_include
 #if !__has_include(<linux/memfd.h>)
  #error "Header 'linux/memfd.h' could not be found"
 #endif
#endif
----------------------------------------------------


3) Steps to reproduce:

$ cpp inctest.c out
inctest.c:3:12: error: #error "Header 'linux/memfd.h' could not be found"

$ strace -f cpp inctest.c out 2>&1 | grep memfd.h | grep /usr/include
[pid  8935] open("/usr/include/1/memfd.h", O_RDONLY|O_NOCTTY) = -1 ENOENT

Note that linux/memfd.h was expanded to 1/memfd.h here.

Presumably #define linux 1 is one of the compiler/preprocessor predefines?

I believe it should not expand filenames (clang doesn't, fwiw).

Adding a #undef linux "fixes" the issue.

Reply via email to