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

            Bug ID: 101695
           Summary: calling incorrect destructor of same-name class in
                    anonymous namespaces in separate translation units
           Product: gcc
           Version: 11.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tom_maly at volny dot cz
  Target Milestone: ---

Created attachment 51225
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51225&action=edit
commit 079009b17cac42fb7c46adcee6055b4776b1360f

I have two cpp files, each with anonymous namespace with a class with same
name.
I store member function pointer to method that call the destructor.
Destructor from same translation unit is used in both cases.

Tested with g++ 9, 10, and 11 - all incorrect.
Also tested with clang 10 and msvc - both correct.

All source code to reproduce the bug (in addition to the attached archive) is
available at:
https://github.com/malytomas/gppBugAnonDestr

The github actions show results for all mentioned compilers.



More detailed info:

At least two translation units are required to separate the anonymous
namespaces.

Example command line used for compilation:
/usr/bin/g++-11   -Wall -Wextra -g -std=gnu++17 -MD -MT
CMakeFiles/gppBugAnonDestr.dir/sources/aaa.cpp.o -MF
CMakeFiles/gppBugAnonDestr.dir/sources/aaa.cpp.o.d -o
CMakeFiles/gppBugAnonDestr.dir/sources/aaa.cpp.o -c
/home/runner/work/gppBugAnonDestr/gppBugAnonDestr/sources/aaa.cpp

Example g++ version:
g++-11 (Ubuntu 11.1.0-1ubuntu1~20.04) 11.1.0

In the test code, a counter is used to detect which constructors/destructors
are called and an exception is thrown when number of constructors does not
match number of destructors.

Structure MemoryArena is used to create and destroy the Tester structures.
I could not reproduce the bug without it (using just free functions).

The struct Holder is very simplified std::unique_ptr.

Struct Delegate is simpler std::function. Simplifying it even further (making
it non template) also partially fixes the bug, therefore I keep it as is.



Feel free to contact me if you need any further information.
Thanks

Reply via email to