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

    <tr>
        <th>Summary</th>
        <td>
            [Clang] Clang cannot deduce the type of a wrapper function.
        </td>
    </tr>

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

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

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

<pre>
    Repro file: https://godbolt.org/z/MPT6qezjs
```C++
#include <iostream>
#include <concepts>
#include <type_traits>

template<typename Fp, typename... A>
concept AcanPasstoFp = requires(Fp f, A... as) {
 f(as...);
};
template<typename R, typename Fp, typename... A>
requires AcanPasstoFp<Fp, A...>
using WrapperType = R(*)(Fp, A...);

template<typename R, typename Fp, typename... A>
void metaWrapper(WrapperType<R, Fp, A...> wrapper, Fp f, A... as) {
 wrapper(f, as...);
}

template<typename R, typename... A, typename Fp = R(*)(A...)>
void wrapper1(Fp f, A... as) {
        std::cout << "wrapper1 !!" << std::endl;
  f(as...);
}

void f1(int x) {
 std::cout << "f1" << std::endl;
}

int main() {
 metaWrapper(wrapper1, f1, 1); 
}
```

I thought Clang can easily deduce `R` of metaWrapper cause the return type of wrapper is obviously `void`. But it fails with the following error message:
```
<source>:29:3: error: no matching function for call to 'metaWrapper'
  metaWrapper(wrapper1, f1, 1); 
 ^~~~~~~~~~~
<source>:14:6: note: candidate template ignored: couldn't infer template argument 'R'
void metaWrapper(WrapperType<R, Fp, A...> wrapper, Fp f, A... as) {
     ^
1 error generated.
```

Since I am new to generic programming with C++, I cannot tell if it's my fault or Clang's problem. Could anyone explain? Thanks
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vs9vozgU_mteLk-DwE6AHHJg6CDNYaVRt9IeVw48wLPGZmzTTuawf_vKJNCk23Y00i5CLeH9-r7P7xkL52SniQ6w-wi7u42YfG_soRfmJHS3z-Pt5mia0-GeRmuwlYqAF9h7PzrgBbAKWNWZ5miUj4ztgFU_gFW_fXlIv9GPrw7iO4gLSOPzXQL7GO7zW8alrtXUEAIvpXHekhiAf3rNXBtd0-jdG2Z_GulPb4W89pj_ehpGJTxdnLQYCKsRWInLzyiKsFijLoWwqIX-IpzzphoR-B1a-jZJSw5YXo3YhgxFCBUO2B4hu7AKlly4KIqA7YEvXLO79fk1RPfXgN7Ft8C4AQi8PMcERKvr5KTu8A8rxpHsw2mkmcc9sBxYEdAFJmvUNdr_AOejkQ0O5MWlPrD8Cgnwck51gxqfFtdgeEfi1S-ffV5V-1eInJHfMvu3VqtK1wwvUJKfdAXEe-ebMDG8qM3kQ88CLxEYWzIgsGS-2WJcI0g3aiWHb3fYFecZXBtgSe3x-61-b0Fpf179RZmQfBBSzzpdl7hd-WeVyhlUickZO77MuuwU10U-o-_N1PUeSyV0h7XQSMJJdcKGmqkmhDS-hzRG014XxlpMjtD3hJb8ZPW8vsHpggelQ3N8lGZy6hSSBNUgjSP8OHmUHlshlcMn6fs5S2uUMk9hqMhaY3Eg50QXdsTX0fPSmcnWFFqGF4FwwcP2OUeHB21wEL7uQ8p20rWXRmNrAnKl0BsElt0omS098Gv6Iuw-_b1er6JLtsCL9AzKz5t8LXQjG-EJlwFC2WljqZmtZlKNBpZ5lLol--wkbDcNpH0Af79C_j_3g3DB7jKWyWVxOtJkhacmeqe1fpe6JvyMYkBNT0HxOUzWOFrTWTEMYWnmBli-XazEz0EbbTx6Ugpli9IDyxwOJ2zFpDwae27V-e1ozVHREGEZJEOhT0YT0vdRhcHhFT70Qv_lNs2BN3u-Fxs6JGm2j9M42aab_lA3LBd5XLM6TrgQfJ_lNbV8m9EuYSnlG3lgMeMxT7KE8902jfIkFRTHedJke8YpgW1Mg5AqUupxCJ_pjXRuokOabDO2UeJIys0HAMaCCrMRGAvnAXsIMR-OU-dgGyvpvHvO4qVX88nhTHZ39zygQZ3LcIbJWQZPrKO3tHu0maw6vDhQSN9Px6g2A7AqVLv8-zBa85VqD6yaMTpg1czhnwAAAP__ECWX1w">