[Bug c++/77316] [5 Regression] Unnecessary template copy constructor weak symbol emitted in wrong section

rbd at debian dot org gcc-bugzilla@gcc.gnu.org
Mon Aug 22 21:16:00 GMT 2016


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

--- Comment #4 from Roland Dreier <rbd at debian dot org> ---
Discovered this is due to abi-compat, I think.  gcc 6 works because abi-compat
went from 2 (gcc 5.4) to 8, and the significant break is 6 -> 7:

$ g++ -Wabi=6 --std=c++11 -c b.cpp                                              
b.cpp: In instantiation of ‘vec<A>::vec(A) [with A = alloc<std::nullptr_t>]’:
b.cpp:5:46:   required from ‘void vec<A>::operator=(vec<A>) [with A =
alloc<std::nullptr_t>; vec<A> = vec<alloc<std::nullptr_t> >]’
b.cpp:16:6:   required from here
b.cpp:4:3: warning: the mangled name of ‘vec<A>::vec(A) [with A =
alloc<std::nullptr_t>]’ changed between -fabi-version=6
(_ZN3vecI5allocIDnEEC1ES2_) and -fabi-version=9 (_ZN3vecI5allocIDnEEC1ES1_)
[-Wabi]
   vec(A) {}
   ^
b.cpp:4:3: warning: the mangled name of ‘vec<A>::vec(A) [with A =
alloc<std::nullptr_t>]’ changed between -fabi-version=6
(_ZN3vecI5allocIDnEEC2ES2_) and -fabi-version=9 (_ZN3vecI5allocIDnEEC2ES1_)
[-Wabi]
b.cpp:5:8: warning: the mangled name of ‘void vec<A>::operator=(vec<A>) [with A
= alloc<std::nullptr_t>; vec<A> = vec<alloc<std::nullptr_t> >]’ changed between
-fabi-version=6 (_ZN3vecI5allocIDnEEaSES3_) and -fabi-version=9
(_ZN3vecI5allocIDnEEaSES2_) [-Wabi]
   void operator=(vec) { vec a(get_allocator()); }
        ^

So gcc is generating a backward-compatible symbol that happens to collide with
a different symbol in the current ABI.

Not sure I see a way for this to be fixed, but it's a really unfortunate
booby-trap.  I guess I can work around it by just building with -Wabi=7 and/or
-fabi-compat-version=0.


More information about the Gcc-bugs mailing list