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

    <tr>
        <th>Summary</th>
        <td>
            Regression introduced with implementation of P2036R3 (assertion error)
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          alejandro-alvarez-sonarsource
      </td>
    </tr>
</table>

<pre>
    Hello,

Commit 93d7002dc4644b0a6f15a998dff0d55c72012e87 introduced a regression. A reproducing snippet:

```cpp
template <typename T> T &declval() noexcept {}

template <typename T> struct FakeVoidToVoid {};

template <typename Func> inline auto call(Func &&func) { return func(); }

template <typename Func>
using NormalizedCallResult = FakeVoidToVoid<decltype(call(declval<Func>()))>;

template <typename T> class SemiFuture {
public:
  template <typename Func> auto then(Func &&func) {
    return and_then(wrapCB<T>(func));
  }

  template <typename Func> auto and_then(Func &&func) {
    using Result = NormalizedCallResult<Func>;
  }

protected:
  template <typename RawArg, typename Func> auto wrapCB(Func &&func) {
    return [func = func](auto... args) -> SemiFuture<decltype(func(args...))> {return {};};
 }
};

auto removeDocumentsInRange(SemiFuture<void> waitForActiveQueriesToComplete) {
  return waitForActiveQueriesToComplete.then([]() {});
}
```

This has been reduced from code coming from [MongoDB](https://github.com/mongodb/mongo/blob/e2674b6d474f5eabde5eb44e6a8396ccb6d6fc53/src/mongo/util/future.h#L1367).

Before 93d7002dc4644b0a6f15a998dff0d55c72012e87, the `func` in `decltype(func(args...)` would refer to the parameter `func`. After the commit, it would refer to the variable `func` introduced by the capture. It looks like other parts of the parser (i,e, `TemplateInstantiator::TransformDecl`) do not expect to find a `VarDecl` and fail to handle them.

This regression happens for C++14 and higher, even though "Change scope of lambda trailing-return-type" was introduced with C++23.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVl1v2zoS_TX0yyCCTEqy9OAHf9TYAruL3VyjrxcjamSxpUiBpJy2v_6Ckpy4aZsGEJSInI8zZw6HRu_VxRBtWb5n-XGFY-is26Kmz2gaZx9QX9HR9wdvDTpvRydpVdvm2_ZfpLVl_MDSI0t38_tg-14FqESzSVPeyKzIsjrFol3nWFVl07Zpk-dyw9M1p3IDygRnm1FSAwiOLo68V9YksANHw7SlzAW8UcNAgYndfTJWpPMjh2FeCdQPGgMBE4fwbSCDPcGZiQ9wBsaLhqS-oma8ZLwCY-mrpCEA2-zZ5ngf-fdxfHCjDHDCL_TJquZs4_sWQez_GOQ0GhnjKKOVIcAxWJCoI6a4FVEyXrTRilcxLjgKozMwL0XgTOzhPXiXVLPF6COP_7WuR62-U3NArR_JjzoAE8dX9TBxiFTFSIyXC7wbeeJwCzyjmR_x4T3VTxRKjd7DX9Sr0xhGRxN7k88w1lrJ5y4DvEnhxF3oyPyWu1sYuJGIpvl78XhyOBz2TBzOcymL28zvzfEVze8BdJfiT6Dmntx14VftueP7t7gGZwPJQM2fqHvEp527MH6AX4NfSHk3nyzft5OlOM4CzY-MlzFUkiSA7uKj50OM_9LvH9W16DraJknyrKaY7pbk-XDdHbE7Cn46eFMpjnp7paOVY08m-I_mEc0lJvwByHVS-wd4QhVO1u1kUFf6_0hOkT_bg-0HTYFelb_getsnWUQwj9Vl5Cyl3GnspYzbMLuv5NwpDx16qIkMOJonZetsD9I2BNL2UULTAsv3_7HmYo9Lvi6EwUdB8BPjp4sK3Vgn0vaMn_po19S3_xg_1drGT-LFJquLJttkbU5YN5RTnWVUYCmqQsq6aIpW5oLxk3fyzn8MSjN-aidek45x8e-1KDaMV8l9PXtqraN3Xw-TUDsCVqSTTIoUlIlfb-qnSOHJjroBRy05mIcEDOiwp0DuLloCuzauxH053Vwxowq_8r-iU1jrV2Ceb6_62xwFh4kB-BhAW_vFg1ZfCGzoyEUIwYNtb3h8BMNLxfiBYmJWpOfl1H40PqAJCoN1sYdid3ZofGtdfySpo0x4BY0FYwPQ14FkiEBbZeJFyor0E7rFME4kaFHpaNChaTRFAH3yk9Be7l_ocBjIeGitgwPje8b362yK1KlLRy7CpSsZCJ0dLx0wzg9dPGDgpR0oFqmxrxuE4FBpZS4P86l5mNvG4Qn9PX9PKnS3TFwkq2YrmkpUuKLtuqiEWGdZka26LedrjmJTVkXdYouSZ9U6JZlj3WJZEl-pLU-5SEterUW6EVVCeU3lOhMlFeuilBnLUupR6UTra59Yd1kp70faFnlabFYaa9L-9mPIbaPRQz1ePMtSrXzwL25BBU3bxxfSXpej4iSI0wdD3LYt_I-nongUsevoPblpnZyzjvFqNTq9fePUxsTLn4fB2c8kA-OnCbxn_DTh_ycAAP__mL0Kfw">