https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91476
Bug ID: 91476
Summary: const reference variables sharing the same name in two
anonymous namespaces cause a multiple definition error
Product: gcc
Version: 9.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: abbeyj+gcc at gmail dot com
Target Milestone: ---
There is a problem when having two different variables both of which are const
references and which have the same name but are in different anonymous
namespaces. You'll need at least two files to reproduce this, say a.cpp and
b.cpp.
a.cpp:
namespace { const int &foo = 1; }
int main() {}
b.cpp:
namespace { const int &foo = 2; }
Then compile and link:
$ g++ -c a.cpp b.cpp
$ g++ a.o b.o
b.o:(.rodata+0x0): multiple definition of `_ZGRN12_GLOBAL__N_13fooE_'
a.o:(.rodata+0x0): first defined here
collect2: error: ld returned 1 exit status
This works fine in older versions of GCC and in clang.
Looking at the output on https://gcc.godbolt.org/z/A6LxAG shows the following
differences:
- The mangled name for "reference temporary #0 for (anonymous namespace)::foo"
changed from _ZGRN12_GLOBAL__N_13fooE0 to _ZGRN12_GLOBAL__N_13fooE_.
Interestingly, godbolt.org is unable to demangle the second name.
- There is an additional line `.globl _ZGRN12_GLOBAL__N_13fooE_`. This seems
like the part causing the issue.
I originally found this when using objects of class type with user-defined
constructors. I reduced it down to using `int` for this bug report. Any
proposed fix should probably be tested with such types in addition to plain
`int`.
gcc version 9.1.0 (GCC)
Target: x86_64-pc-linux-gnu