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

    <tr>
        <th>Summary</th>
        <td>
            [clang] Invalid diagnosis "unnamed variable cannot be implicitly captured in a lambda expression" in templated context
        </td>
    </tr>

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

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

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

<pre>
    Minimal reproducer:

```cpp
template <typename T, typename U>
constexpr bool same_as = false;
template <typename T>
constexpr bool same_as<T, T> = true;

template <typename Type, typename... Choices>
concept OneOf = (... || same_as<Type, Choices>);

template <OneOf<int, double> FromType>
double f(FromType);
extern template double f<int>(int);

template <OneOf<int, double> FromType>
double f(const FromType from_value) {
  using RtnType = decltype(f(from_value));
  [&] {
    (void) from_value;
  }();
  return 0;
}

template double f<int>(int);
```

```bash
$ clang++  -std=c++20 input.cpp
input.cpp:17:12: error: unnamed variable cannot be implicitly captured in a lambda expression
   17 |     (void) from_value;
      | ^
input.cpp:16:7: note: while substituting into a lambda expression here
   16 |   [&] {
      |       ^
input.cpp:22:17: note: in instantiation of function template specialization 'f<int>' requested here
   22 | template double f<int>(int);
      | ^
input.cpp:10:18: note: declared here
   10 | double f(FromType);
 |                  ^
1 error generated.
Compiler returned: 1
```

`from_value` is not an unnamed variable (obviously). Somehow, the combination of concepts, forward declaration of template specialization, and the `decltype(f(from_value))` causes the error. Removing any of these elements clears the error.

I could reproduce it from clang 12 all the way to trunk.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVk1v4zYQ_TX0ZRBBomJLOuiQ2GtgD8UC2_a8oMiRxZYiVX44cX99QcqRlTabbIENAskSZ948zrwZkTknTxqxJdtHsj1sWPCDsa2WXqNiZ9x0RlzaX6SWI1NgcbJGBI6WlA8kP5D85brL538-TfMbj-OkmEcg5d5fJtRsRPiN0D0sT7-T8tNszI12Hp8nC50xChwb8RtzQMoD9Ew5JOXju6jv45BynwJHu4TpbbhBvgd8mXDNOMsy2A9GcnTrkBwnD180fukTOqF1NCTVnlT7NYcr2gqBNu_QSIik3Evto5swoVMYt3C0ZkxgLxzmJegJrZe1FTQ-e7QaFuzFfMaOPOoU5KezSfVYLKC3Zvx2ZipEekCqazCA4KQ-wVevk1lMokCufNpHHYFeea6JAkTh0h3ZHtaAEKtwNlLEQCvnlVt1ILR-DWXRB6shv6WhOryZjx_J4EtHvNkmHXPD9RW9B66YPhH6SOgjwJ3zgpQHPj_THKSegs-Wxro9lg9FFS-UlA-A1prYlRB0lKqAM7OSRZacaW08dAhynJTk0qsLcDb5YFGA1MBAsbETDGLnoHPS6CWPRRWFDD-S0WRT7YFsP73BdEfKh8gWtPEY70-DVAgudM5LH3wUgNTevMUGBrR4o7S7UvpO5WFhDG9zofQldQsZqUFq55n2kvkY0fTQB83T76XsbkIumZJ_zzaEVmsFVGDxr4DOo3hNmNLE6P-o56Ns5vFSr3cQG4bZf4cu8gTywYBYJWz1t0QuZnHBCTVa5lFk8_u9GSep0F77BkXkUbwv_5VydjlIF_kD0_9VLaG16c7SBKcuhDYZ_GpGHMxTmscDAjdjJ_VSrOsYdnG5N_aJWXFNyWLynTJGD6ZFAiW7_KPBs8uBs-DQJYeUmAy-4mjOUcFMX1KoAR0CKhxRewdcIbNrh3VSPgM3QYnbtxWkTw02jwUoKDClkvMTu4A38fOl_8w2oi1FUzZsg21R0ZIWzTZvNkNbsabndYfNrt6KvkDaFNu-a_r7nu1EU7GNbGlO7_M6b4pdvs2rrC9wW_Z503Rc1LWg5D7HkUmVKXUeM2NPG-lcwLbI6a6sN4p1qFw6MVB6nV00Hh5sGx3uunBy5D5X0nl3g_DSq3TMmD22B_isz0xJAUKykzZOOiCU_pzxRWlceam4iPLw-Ow3wap28H5y8fxCj4QeT9IPocu4GQk9RrLX291kzR_IPaHHtHlH6PG6_3NL_wkAAP__N6XQfQ">