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

            Bug ID: 108781
           Summary: Underlying variables of structured bindings should not
                    be treated as having external or module linkage
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Keywords: link-failure, rejects-valid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: de34 at live dot cn
  Target Milestone: ---

For the following example with two translation units:

```C++
// main.cpp
using Arr = int[2];
auto [bx, by] = Arr{};

int main(){}
```
```C++
// a.cpp
using Arr = int[2];
auto [bx, by] = Arr{};
```

Currently a linker error is emitted (Godbolt link:
https://godbolt.org/z/e43s4ErKs):

> /opt/compiler-explorer/gcc-trunk-20230213/bin/../lib/gcc/x86_64-linux-gnu/13.0.1/../../../../x86_64-linux-gnu/bin/ld:
>  CMakeFiles/test.dir/main.cpp.o:(.bss+0x0): multiple definition of 
> `_ZDC2bx2byE'; CMakeFiles/test.dir/a.cpp.o:(.bss+0x0): first defined here

The linker succeeds if `[bx, by]` is changed to `[bx, bz]` in either TU (but
not both).

Presumably, _ZDC2bx2byE is the mangled name of the unnamed variable created in
the structured binding declaration. Per current standard wording ([basic.link],
see also discussion in https://github.com/cplusplus/CWG/issues/240), structured
bindings have no linkage, and so do the unname variables because they don't
even have names.

So linker should be successful for this example, and both TUs have its own
distinct unnamed variable.

Reply via email to