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

    <tr>
        <th>Summary</th>
        <td>
            Incorrect promise constructor used with lambda coroutines
        </td>
    </tr>

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

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

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

<pre>
    In the C++20 program below, the lambda has a non-static member operator(), but its object parameter is skipped when looking for a promise constructor overload. This results in the first overload being called, and an output of `Wrong`.

Tested on 18.1.5 and 19.0.0git (b5af667b01458e9083256f2614df175916c73e5a). When compiled with GCC or MSVC, the output is `Correct`, as expected.

Additionally, removing the second constructor should make the resulting program no longer compile, which is the case with MSVC and GCC, but not Clang.

```c++
#include <coroutine>
#include <iostream>

struct coro {};

struct promise {
    promise(int) {std::cout << "Wrong\n";}
 promise(auto, int){std::cout << "Correct\n";} // Remove me for an additional test case!

    coro get_return_object() {return {};}
 std::suspend_never initial_suspend() {return {};}
    std::suspend_never final_suspend() noexcept {return {};}
    void return_value(int) {}
 void unhandled_exception() {}
};

template<typename... T>
struct std::coroutine_traits<coro, T...> {
    using promise_type = promise;
};

int main() {
    int x = 0;
    [x](int y) -> coro { co_return x + y; }(1);
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVU1v4zgM_TXKhahhy1FiH3JonOlgDnvZLXaOgSwxsXZkyZDotP33C9lOmmBmP4DCBSTy8T3yMZIxmrND3DGxZ-KwkiN1PuysdBqtDLhqvf7YfXNAHULD-J7xPc9hCP4cZA8tWv_GeDNdW9m3WkInI0hw3j1FkmQU9Ni3GMAPGCT5wHjFeJ2S2pHAUATf_oWKYJBB9kgYwESIP8wwoIa3Dh1Y738Yd4aTDyBT8d5EBOVdpDAq8gH8BYP1Umfw2pkIAeNoKYKZiZ9MiHSLgRYTmJLWok48pNMgHfiRhpHAn4Bt8u_BuzPb5BnLDyx_nr-vGAk1eAdFlRWZmDKLOsuz_GwIGK9aIU-bzbbNi7WosM6rkovNiW-KtT4VW1EXG7UtUUjG6wy-J23K94OxSamhDr42DfgAv_3xZ3Nt60LLxESr8SGgIrbJJ-IR8H1ARagfeD5rbch4J639SHEBe39JmhNeROWdfuhe7PxoNfTyB04hc_tSwnXQzoP17ozhyjfBvnVGdYlYylEy4qwhkZ8687VprmN2nqCx0p0feCYZ05-anbWc8tI4ZUeNwMpG-eBHMg5Z-eVX98ZHCij7z-vpO2uDlA1su2fbAyv3vwi4minFTOcAcD1kvDKOGK_TbSTNymdWPis_UirMygYY57NRROMY56nE9rDgfILIkXxqxAz2L1jX6d6jAeMvjL_A72mGCD3OW-BA3oYMhJGmATBe3GtMWqYOnJGOAWkM7jgv27yESdd8fNejm4AbyzjGAZ0-Oryk5XSGjLTH5fT_IAH8E9jJuJ-gnMd3hQP9J-bFGw2LrIu04-PAPkOnuNF10mmL-jijG-8-qd9if_YJYT9YScjKhj4GdLLHLMvg9ea3xUh3M10Me6QgDcXFw8kAr1mWsfLLo9nGuCxacssx1QBWHm72ubH5iZlxBL009zJuoOnufcLJb1npnIn9OxOHuVHwkfKeEqPrnoDyi1FSOt_DByv3kGrzqkjmvafzuMMrvSt1XdZyhbtiW4hNIQQXq24nVCHX5UmIss7XKDDfVgKLvF5XlV5zzFdmx3O-zkVRppRcZK2uq0JttsXpJPEkNVvn2EtjM2svfebDeWViHHFXF3VVrqxs0cbpBePc4RtMl2mBxGEVdinnqR3Pka1zayLFTxQyZHH3zal57375sozx-tu8vG-3-cbVGOyuIxpimvy0pmdD3dhmyveMv6Q6y7-nIfh5714mdpHxl4n93wEAAP__RQRM5Q">