[Bug c++/101695] calling incorrect destructor of same-name class in anonymous namespaces in separate translation units
redi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Aug 6 10:14:32 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101695
Jonathan Wakely <redi at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Attachment #51268|0 |1
is obsolete| |
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Created attachment 51269
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51269&action=edit
Tar file with reproducer
Slightly further reduced.
The bug is the visibility of this symbol:
0000000000000000 W
_ZN8DelegateIFvPvEE4bindI11MemoryArenaXadL_ZNS4_7destroyIN12_GLOBAL__N_16TesterEEEvS0_EEEERS2_PT_
That should have internal linkage. Because both aaa.o and bbb.o contain that as
a weak symbol, the linker merges them and only keeps the first one, which runs
the destroy<{aaa.cpp anonymous namespace}::Tester> specialization, which casts
the void* to that type and so deletes it as the wrong type, which runs the
wrong destructor, and decrements the wrong counter.
More information about the Gcc-bugs
mailing list