https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85311
Bug ID: 85311 Summary: const& aggregate parameter with empty default brace initializer results in undefined references to std containers Product: gcc Version: 7.3.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: vis...@royal-caliber.com Target Milestone: --- Created attachment 43890 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=43890&action=edit preprocessed output Hello, The following code fails to link: ----------test.cpp------------------ #include <vector> struct Foo { std::vector<int> x; }; void foo(const Foo& = {}) { } int main() { foo(); } ----------------------------------- $ g++ test.cpp /tmp/ccJsJY1c.o: In function `main': test.cpp:(.text+0x2a): undefined reference to `std::vector<int, std::allocator<int> >::vector()' collect2: error: ld returned 1 exit status The problem is triggered by the default value for the parameter to foo(). It can be avoided by either changing the prototype of foo() to not have a default value, or by actually providing a value in the call to foo(). The same behavior occurs with several other std containers inside the aggregate such as deque and list. It can be reproduced in gcc versions 6.4.0, 7.2.0 and 7.3.0 and libstdc++ versions 6.0.22 and 6.0.24. The preprocessed file is attached. The output of g++ -v follows. Thank you, Vishal Output of "g++-7.3 -v -save-temps test.cpp" Using built-in specs. COLLECT_GCC=g++-7.3 COLLECT_LTO_WRAPPER=/home/vishal/localbuild/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ./configure --enable-languages=c,c++ --prefix=/home/vishal/localbuild --program-suffix=-7.3 --disable-multilib Thread model: posix gcc version 7.3.0 (GCC) COLLECT_GCC_OPTIONS='-v' '-save-temps' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /home/vishal/localbuild/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/cc1plus -E -quiet -v -D_GNU_SOURCE test.cpp -mtune=generic -march=x86-64 -fpch-preprocess -o test.ii ignoring nonexistent directory "/usr/local/include" ignoring nonexistent directory "/home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../x86_64-pc-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0 /home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0/x86_64-pc-linux-gnu /home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../include/c++/7.3.0/backward /home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/include /home/vishal/localbuild/include /home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/include-fixed /usr/include End of search list. COLLECT_GCC_OPTIONS='-v' '-save-temps' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /home/vishal/localbuild/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/cc1plus -fpreprocessed test.ii -quiet -dumpbase test.cpp -mtune=generic -march=x86-64 -auxbase test -version -o test.s GNU C++14 (GCC) version 7.3.0 (x86_64-pc-linux-gnu) compiled by GNU C version 7.3.0, GMP version 6.1.0, MPFR version 3.1.3-p4, MPC version 1.0.2, isl version none warning: GMP header version 6.1.0 differs from library version 6.1.2. warning: MPFR header version 3.1.3-p4 differs from library version 3.1.6. warning: MPC header version 1.0.2 differs from library version 1.0.3. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 GNU C++14 (GCC) version 7.3.0 (x86_64-pc-linux-gnu) compiled by GNU C version 7.3.0, GMP version 6.1.0, MPFR version 3.1.3-p4, MPC version 1.0.2, isl version none warning: GMP header version 6.1.0 differs from library version 6.1.2. warning: MPFR header version 3.1.3-p4 differs from library version 3.1.6. warning: MPC header version 1.0.2 differs from library version 1.0.3. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: e93c907a87f28f1e65d001f94ea5afa5 COLLECT_GCC_OPTIONS='-v' '-save-temps' '-shared-libgcc' '-mtune=generic' '-march=x86-64' as -v --64 -o test.o test.s GNU assembler version 2.29.1 (x86_64-pc-linux-gnu) using BFD version (Gentoo 2.29.1 p3) 2.29.1 COMPILER_PATH=/home/vishal/localbuild/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/:/home/vishal/localbuild/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/:/home/vishal/localbuild/libexec/gcc/x86_64-pc-linux-gnu/:/home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/:/home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/ LIBRARY_PATH=/home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/:/home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-v' '-save-temps' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /home/vishal/localbuild/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/collect2 -plugin /home/vishal/localbuild/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/liblto_plugin.so -plugin-opt=/home/vishal/localbuild/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/lto-wrapper -plugin-opt=-fresolution=test.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/../lib64/crt1.o /usr/lib/../lib64/crti.o /home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/crtbegin.o -L/home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0 -L/home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../.. test.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /home/vishal/localbuild/lib/gcc/x86_64-pc-linux-gnu/7.3.0/crtend.o /usr/lib/../lib64/crtn.o test.o: In function `main': test.cpp:(.text+0x1b): undefined reference to `std::vector<int, std::allocator<int> >::vector()' collect2: error: ld returned 1 exit status