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

            Bug ID: 94667
           Summary: GCC duplicates prerequisites when generating 'make'
                    rules if headers are not in current directory
           Product: gcc
           Version: 9.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: iskustvo at yahoo dot com
  Target Milestone: ---

Invoking GCC with both -I and -M* flags ends up duplicating prerequisites in
generated 'make' rule.



Small SHELL script which can create minimal environment for reproduction:
--------------------------------------------------------------------
#!/bin/sh

mkdir -p bug/src bug/include
touch bug/include/a.h
echo '#include "a.h"' > bug/include/b.h
printf '%s\n%s\n' '#include "a.h"' '#include "b.h"' > bug/src/main.c

gcc -I bug/include -MM bug/src/main.c
--------------------------------------------------------------------


Output from the above script:
----------------------------------------------------------------------
main.o: bug/src/main.c bug/include/a.h bug/include/b.h bug/include/a.h
----------------------------------------------------------------------
Note that "bug/include/a.h" is duplicated in the prerequisite list.



Additional notes:
1) Issue was originally detected in C++ code.
2) Header guards(omitted for simplicity of example) don't solve this issue.
3) After moving headers from 'include' to 'src', GCC gives desired output.
4) Replacing "gcc" with "clang" gives desired output.



Issue is reproducible with both system's and latest versions of GCC.

System GCC: /usr/bin/gcc -v
----------------------------------------------------------------------
Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/9.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib
--libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info
--with-pkgversion='Arch Linux 9.3.0-1'
--with-bugurl=https://bugs.archlinux.org/
--enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --enable-shared
--enable-threads=posix --with-system-zlib --with-isl --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch
--disable-libssp --enable-gnu-unique-object --enable-linker-build-id
--enable-lto --enable-plugin --enable-install-libiberty
--with-linker-hash-style=gnu --enable-gnu-indirect-function --enable-multilib
--disable-werror --enable-checking=release --enable-default-pie
--enable-default-ssp --enable-cet=auto gdc_include_dir=/usr/include/dlang/gdc
Thread model: posix
gcc version 9.3.0 (Arch Linux 9.3.0-1)
----------------------------------------------------------------------


Latest manually built GCC: /usr/local/bin/gcc -v
----------------------------------------------------------------------
Using built-in specs.
COLLECT_GCC=/usr/local/bin/gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/10.0.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ./configure
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.0.1 20200419 (experimental) [master revision
62f3d4ea899:7def9c6a6f6:fc186077486fb6e5453157ad8507c66d0a34017c] (GCC)
----------------------------------------------------------------------

Reply via email to