https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111069
Bug ID: 111069 Summary: Mangling of static structured bindings Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: jakub at gcc dot gnu.org Target Milestone: --- void corge () { static int a[2]; static auto [i, j] = a; static auto [k, l] = a; { static auto [i, j] = a; static auto [k, l] = a; } { static auto [i, j] = a; static auto [k, l] = a; } } fails to assemble with -std=c++20, we use _ZNDC1i1jEE and _ZNDC1k1lEE as names of the local variables multiple times (+ _ZGVZ5corgevE11_ZNDC1i1jEE and _ZGVZ5corgevE11_ZNDC1k1lEE for guards which are emitted each just once but prevent the initialization of the second and third case). clang++ uses _ZZ5corgevEDC1i1jE, _ZZ5corgevEDC1k1lE_0, _ZZ5corgevEDC1i1jE_1, _ZZ5corgevEDC1k1lE_2 etc. and corresponding guard vars. Now, I guess for local vars it is up to us to name those as we want as long as there is no clash, with inline void freddy () { static int a[2]; static auto [i, j] = a; static auto [k, l] = a; { static auto [i, j] = a; static auto [k, l] = a; } { static auto [i, j] = a; static auto [k, l] = a; } } void (*p)() = &freddy; it is an ABI issue.