[Bug preprocessor/66932] New: Preprocessor includes wrong header file

2015-07-18 Thread pilot.mm at gmail dot com
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

2015-07-19 Thread pilot.mm at gmail dot com
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

2015-07-20 Thread pilot.mm at gmail dot com
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...