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

    <tr>
        <th>Summary</th>
        <td>
            Nested lambda binding reference drops 'const' qualifier on non-const variable
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          aldo-roseman
      </td>
    </tr>
</table>

<pre>
    The following program does not compile in Clang 17, but does in Clang 16: https://godbolt.org/z/rfGfWjrP1
```cpp
#include <type_traits>
#include <concepts>

class simple_class1 {};

class simple_class2_base {};

template <typename T>
concept simple_class2 = std::is_base_of_v<simple_class2_base, T>;

template <typename Func>
void function_with_lambda1(Func&& func) {
    return;
}

template <std::invocable<simple_class2_base&> Mapper>
void function_with_lambda2(Mapper&& mapper) {
    return;
}

template <typename T> // Removing the template makes it compile
void function_with_template(simple_class1 foo) {
 function_with_lambda1([&foo]() {
 //function_with_lambda2([&foo]<simple_class2 V>(V const& bar) { // Does not compile
        function_with_lambda2([&foo](simple_class2 auto const& bar) { // Does not compile
        //function_with_lambda2([&foo](auto const& bar) { // Does compile
            (void)foo; // Suppress unused warning
        });
    });
}

int main() {
 simple_class1 foo;
    function_with_template<int>(foo);
    return 0;
}
```
The error message is (as seen in the godbolt):
```
<source>:23:29: error: binding reference of type 'simple_class1' to value of type 'const simple_class1' drops 'const' qualifier
   23 |     function_with_lambda1([&foo]() {
      | ^~~
<source>:23:27: note: while substituting into a lambda expression here
   23 |     function_with_lambda1([&foo]() {
 |                           ^
<source>:34:5: note: in instantiation of function template specialization 'function_with_template<int>' requested here
   34 |     function_with_template<int>(foo);
      |     ^
1 error generated.
```
It is particularly strange as `foo` is not const.

Note that quite some conditions have to be met for the program to fail compiling:
- The function needs to have a template
- There have to be two nested lambdas with binding references
- The second lambda needs to have specific syntax
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVk9z4rgT_TTi0pWULWEbDhwYCL_6HXZqa3dq9kjJdhs0K0seSYbJHOazb7UNBicwyU4tlSKx_Lpf_3ndkfRe7QzigiUfWLKeyDbsrVtIXdoHZz3W0kxyWz4vPu0RKqu1PSqzg8bZnZM1lBY9GBugsHWjNIIysNLS7CDOGF9B3oYeczlPmVjCPoTGM7FkfMP4ZmfL3OrwaN2O8c13xjeu-l_11xf3e8yiNYuWLI36n6JpTidcKFPotkRgYhWeG9wGJ1XwTDzdQhTWFNhcv-6-Cy29B6_qRuO2e4iBZR9Ytmbiw8-BfJtLj7fRAetGyzDEZmSN8GngPgUzdgdMrMGHkqoilsp37re22h6YWL0mpup2Ht_BvGlNMZAfrCqhak0RlDXbowr7rZZ1XsqY8VmH5CnjaQdhfN4l2BkCADgMrTMXzmx9j_ySiTnYQuYa76SRMvEEv8mmQfd2jJzx2QnbR1mfHn45zlF7oNcj_IG1PZDOwx5hQNfyb1LyIPa7sZ4tGJ-NpVVZOw71Xh9oGnlK8GRNjyOjPsh75RmZvig5fKYS89lnKKzxgQqYy3P1zsmvX8z0par0eRftOG8Osg321yn_Rb589i6qmzQ91Yz6yficHIrB6s-2aRx6D61pPZZwlM4os3sRZ7ZmfD6I7sbRCx0qE6CWyrzq8GvVXDu9IzaxUib0_e11NjLqJwKiG7Gcl2v_SIsenbMOavRe7hCUp7pIDx7R0CanqTjt7I5medMRic-2rsBuSy25oC9C9-7pj1yZksbMYYUOTYFgK6CJBMazUREYzyBYOEjdjkBdp-EVtHS28cN7OvnaSq0qhW4oCRfAstVdUb85hqeer4AlTz9-_CTnjFI1llq0hOOe_k36NvdBhTZQ9soECxJ6WsBvndKUNbBHh_9ZuGfj2x-WPN3MQEyZWCbXCSiSgA_SBCUpCOrGOaDLrvQNFkpq9b3HMJ69qdoMHH5t0Qcsx5mL6Z3M3yl9GMyHLOOTxHdo0MmA5eNNCf8_kPgb6YIqWi2dfgYfnDQ7BOmBpRGxpRGB-u1lfHi8nvCPNiCEvQzwtVVUFlsjwUpFWXjYywOSrnOEGgNU1nXDdb5eBQuVVPq0r2jhnGftAboL2bnuBrH0BO8cyqEPV2CH12zhaMH0te7144FK-noi_TWfR4r9rNQxadfxShXgn02Q3yblQpRzMZcTXMRZFPM0mWXpZL8oEiyT2ZTHnOM0ztJsVpQYzTCZRVUWZfFELXjERRzzeSySOE4fRSxkNM8ymfIym-Ylm0ZYS6UftT7UdGmcKO9bXGQimycTLXPUvrvPcm7wCN1Lxjldb92CbB7ydufZNNLKB3_xElTQuPh4XZUbG-onqwWoE9Y89EvpIJ2ie8-kdXrx4sKrwr7NHwtbM74h_tOvh8bZL1gExjdd1J7xTZfVPwEAAP__-kiTqw">