<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/78715>78715</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang bug: a local class in a nested generic lambda of a template function cannot access to static constexpr local variable and the reference to that local variable
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          wanghan02
      </td>
    </tr>
</table>

<pre>
    The code could be found on [godbolt](https://godbolt.org/z/srz1cqc1n). If the function is not a template or if the local class is not defined inside a nested generic lambda the access is valid.

```
auto foo() {
 static auto constexpr n_static_constexpr = 5;
    constexpr auto const& nref_constexpr = n_static_constexpr;
    auto const& nref_const = n_static_constexpr;
    {
        auto const n_nocap = [](auto) {
 return n_static_constexpr+nref_constexpr+nref_const;
 }(0);
        auto const n_capdefault = [&](auto) {
            return n_static_constexpr+nref_constexpr+nref_const;
        }(0);
 struct S {
            auto foo_mem() {
                return n_static_constexpr+nref_constexpr+nref_const;
            }
 };
        return n_nocap+n_capdefault+S{}.foo_mem();
 }
}

auto foo_nested_lambda() {
    static auto constexpr n_static_constexpr = 5;
    constexpr auto const& nref_constexpr = n_static_constexpr;
    auto const& nref_const = n_static_constexpr;
 return [](auto) {
        constexpr auto const& nref_constexpr_nested = n_static_constexpr;
        auto const& nref_const_nested = n_static_constexpr;
        auto const n_nocap = [](auto) {
 return n_static_constexpr+nref_constexpr+nref_const+nref_constexpr_nested+nref_const_nested;
 }(0);
        auto const n_capdefault = [&](auto) {
 return n_static_constexpr+nref_constexpr+nref_const+nref_constexpr_nested+nref_const_nested;
 }(0);
        struct S {
            auto foo_mem() {
 return n_static_constexpr+nref_constexpr+nref_const+nref_constexpr_nested+nref_const_nested;
 }
        };
        return n_nocap+n_capdefault+S{}.foo_mem();
 }(0);
}

template<typename T>
auto foo_template() {
    static auto constexpr n_static_constexpr = 5;
    constexpr auto const& nref_constexpr = n_static_constexpr;
    auto const& nref_const = n_static_constexpr;
    {
        auto const n_nocap = [](auto) {
 return n_static_constexpr+nref_constexpr+nref_const;
 }(0);
        auto const n_capdefault = [&](auto) {
            return n_static_constexpr+nref_constexpr+nref_const;
        }(0);
 struct S {
            auto foo_mem() {
                return n_static_constexpr+nref_constexpr+nref_const;
            }
 };
        return n_nocap+n_capdefault+S{}.foo_mem();
 }
}

template<typename T>
auto foo_template_nested_lambda() {
 static auto constexpr n_static_constexpr = 5;
    constexpr auto const& nref_constexpr = n_static_constexpr;
    auto const& nref_const = n_static_constexpr;
    return [](auto) {
        constexpr auto const& nref_constexpr_nested = n_static_constexpr;
        auto const& nref_const_nested = n_static_constexpr;
        auto const n_nocap = [](auto) {
            return n_static_constexpr+nref_constexpr+nref_const+nref_constexpr_nested+nref_const_nested;
 }(0);
        auto const n_capdefault = [&](auto) {
 return n_static_constexpr+nref_constexpr+nref_const+nref_constexpr_nested+nref_const_nested;
 }(0);
        struct S {
            auto foo_mem() {
 return n_static_constexpr+nref_constexpr+nref_const+nref_constexpr_nested+nref_const_nested; // doesn't compile with clang
            }
        };
 return n_nocap+n_capdefault+S{}.foo_mem();
    }(0);
}

auto bar() {
    return foo()+foo_nested_lambda()+foo_template<int>()+foo_template_nested_lambda<int>();
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWE1z4zYP_jXUBbMeibIs6aBD_Pr1TM-7dw9FQhI7FOmSVLa7v76jD39IdtJ0N-k0bTgZxQYB8CFEPDDBnJO1RixIsiXJLmCdb4wtvjJdN0yHNCiN-FZ8aRC4Ef2jUwJKhMp0WoDRQJJtbURplCfJjtCs8f7oSPxA6J7Q_TS1MrYmdP-d0L2z3yP-G480ofkKfqnANwhVp7mXRoN0oI0HBh7bo2IewViQo5IynCngijl30hNYSY0CpHZSIDDQ6DwKqFGjlRwUa0vBBmvGOY6Gj0xJsSLhjoQP03MTTn_DV9Z5A5UxhGaE5kDS7SgH55mXHIZ5brTz-PvRgj6M8sNFROIdJCQ-2QFcqV-sCd2AtlgtDG_9zTw9Zf8S28tWpnFxBvqgDWfHwc14GAjN-vl5DCz6zup7C9HtfDMzwQUGSXvHIaH5DNoNGs6OAivWKX-GRDdPoboaPw1wGvdwOm877uHz_ZVP5-bQYntzdhbjtVCekF5iu9Q4rzS83t7bVWgJ3X7uMaa71Qz4_HWNSXL-MEuSw5hyhzHV7m37fWfNFL5nMmIaL8M6heslkJ-D_cNu3jrNl7MT0Jn8JHtbSvin7OAnOONv38INAb4BmSzCtKCVU90n8f_8tyNq1iJ8IfH_F6RzVvvX8c1Hlf6o0q9Xpf9iOv1JMX_3mfUfLeavcKI_6vq7q-swXsFBGHSa0NQDN-1RKoSv0jf9RVrXz9HUlWD5a_hHaeo-Yd-7WZTM3iPnaf3z5ZzQ7RN3kGnmigCl9j3z3ZtdOFjo3uI89QsCUcQij3MWYBGlYbJJ15s4CpoC0zTNYsEY42mVhzRitKzyhCd5gpRjGciChnQdRlEeraMszldhnmXZhnKWRJSKlJN1iC2TaqXUY7sytg6kcx0WaZZGSaBYicoNTRtKxzdJKUl2gS16_U9lVzuyDpV03l08eOkVFoM6lF1N4gdg87aKfrKHYqrrrsy5YcOZHho2Y3fFm1ONuBDo6P-RWclKhcC0GPoxFiu0qDn2Rr5hfqEYdFYVi2aS9E1XrrhpCd33m5r-fTpa8ytyT-h-iJEjdD-E6Y8AAAD__-IX3qs">