https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82873
Bug ID: 82873 Summary: Generated copy constructor calls constructors for 0-sized array members Product: gcc Version: 7.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: matthew.fernandez at gmail dot com Target Milestone: --- Hello there, I'm trying to do something a little unorthodox and ran into an undefined reference during linking. It appears that a generated copy constructor calls another copy constructor that itself is not generated. A minimised example is: #include <vector> class Foo { std::vector<int> x[0]; }; int main(void) { Foo a; Foo b(a); return 0; } Compiling this yields: $ g++ -std=c++17 -W -Wall -Wextra main.cc /tmp/ccfexx8L.o: In function `Foo::Foo(Foo const&)': main.cc:(.text._ZN3FooC2ERKS_[_ZN3FooC5ERKS_]+0x35): undefined reference to `std::vector<int, std::allocator<int> >::vector(std::vector<int, std::allocator<int> > const&)' It seems this is related to the 0-sized array member, which I realise is non-standard (https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html). Making the array member size 1 results in the relevant vector copy constructor being generated, as does inserting the following otherwise-useless code into the translation unit: static inline std::vector<int> dummy(const std::vector<int> &p) { return p; } This behaviour surprised me because I expected GCC to either (1) emit a compile error or (2) generate the relevant constructors. Is this known/expected behaviour? Possibly of relevance PR 42121 and PR 14799.