[Bug preprocessor/66932] New: Preprocessor includes wrong header file
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66932 Bug ID: 66932 Summary: Preprocessor includes wrong header file Product: gcc Version: 4.9.3 Status: UNCONFIRMED Severity: normal Priority: P3 Component: preprocessor Assignee: unassigned at gcc dot gnu.org Reporter: pilot.mm at gmail dot com Target Milestone: --- Created attachment 36011 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36011&action=edit The stripped down test case for the problem... Hello Folks There seems to be an error in the preprocessor where the wrong header file is included. This problem occurs several times when compiling binutils and gcc with newer versions of gcc. I have successfully compiled both of these projects with older versions. Furthermore I have confirmed with the binutils people that this is in fact a gcc bug. For your convenience I have prepared a stripped down version of the problem. The README explains this test case. Basically the problem occurs when there exists multiple header files with the same name in different sub-folders (in my case it was 'config.h'). The problem occurs when you compile one of the problems in the sub folder. This occurs when a -I directive to one of the other sub-folders is given. Furthermore this occurs when the duplicate header file is included indirectly. It seems binutils and gcc assumes that the version in the local directory should be included. Instead the preprocessor includes the one in the other sub-folder. I hope my explanation makes sense. I have created a stripped down version for you folks to understand the problem and hopefully fix it. Take Care Mike
[Bug preprocessor/66932] Preprocessor includes wrong header file
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66932 --- Comment #3 from Michael McWilliam --- (In reply to Jonathan Wakely from comment #2) > Works for me too, with any version. > > gcc_bug$ which gcc > ~/gcc/4.9.3/bin/gcc > gcc_bug$ cd gas > gas$ ./compile.sh > ^[[3~In file included from ./../include/alloca-conf.h:2:0, > from as.h:2, > from as.c:2: > ./config.h:2:2: warning: #warning "You have included the correct include > file" [-Wcpp] > #warning "You have included the correct include file" > ^ > > > Please provide the output of: echo $CPATH $C_INCLUDE_PATH CPATH is empty C_INCLUDE_PATH is: :/usr/local/atlas/include:/usr/local/atlas/include/atlas:/usr/local/atlas/include:/usr/local/atlas/include/atlas So when I remove the leading : in C_INCLUDE_PATH and delete the duplicated entries, magically it works. So clearly there is an error on my machine on the way environment variables are being set... I will have to fix that... I suppose the problem is a NULL path in the variable leads to undefined behaviour... maybe gcc could be improved to ignore null paths or spit a warning or something?
[Bug preprocessor/66932] Preprocessor includes wrong header file
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66932 --- Comment #5 from Michael McWilliam --- (In reply to Andrew Pinski from comment #4) > An empty : causes the current directory to be added. Thanks for explaining that... Including the current directory with an empty : makes sense (as it is in the documented). However that does not seem to be what is happening considering this causes ../bfd/ to take precedent over ./. Simply setting C_INCLUDE_PATH to any of the following will cause the error: C_INCLUDE_PATH=":" C_INCLUDE_PATH=":/usr/include/" C_INCLUDE_PATH="./" C_INCLUDE_PATH="/usr/include/:" According to the documentation the -I directives are included first, then those of C_INCLUDE_PATH, then the system headers. In this problem the local directory is included first with -I. So it seems that when the compiler sees a directory in C_INCLUDE_PATH it forgets any duplicates specified with -I and the include precedence is being broken. Stated simply I think gcc is failing to check if an include directory is already specified when it adds C_INCLUDE_PATH headers in lower precedence. So it seems it is a real bug... and a somewhat obscure bug...