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

            Bug ID: 107741
           Summary: Missed member variable name in mangling of externally
                    visible lambdas used in inline initialization of
                    static members
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dblaikie at gmail dot com
  Target Milestone: ---

https://godbolt.org/z/7514cTh5o
```
struct A {
    static constexpr auto x = [] {
        return 1;
    };
};
template <typename>
struct B {
    static constexpr auto x = [] {
        return 1;
    };
};
template <typename T>
struct C {
    static int x;
};
void side_effect();
template <typename T>
int C<T>::x = (side_effect(), [] { return 1; }());
template int C<int>::x;
void f() {
    A::x();
    B<int>::x();
}
```
GCC produces these manglings:
```
A::{lambda()#1}::operator()() const
_ZNK1AUlvE_clEv

B<int>::{lambda()#3}::operator()() const
_ZNK1BIiEUlvE1_clEv

C<int>::x::{lambda()#1}::operator()() const
_ZNK1CIiE1xMUlvE_clEv
```

I believe in the first two cases, the member variable scope ("::x") is missing.

Oh, and it looks like the lambda numbering is off - B's lambda is 1 within its
scope (either the type or the member) - so I guess that needs to be fixed
too/scoping the numbering to within the member along with the mangling having
that scoping.

Reply via email to