<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">