<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/76837>76837</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Cannot directly call conversion operator in SFINAE context
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
gracicot
</td>
</tr>
</table>
<pre>
Clang seem to not expand the template parameter when directly calling a conversion operator in SFINAE context.
Reproduction:
```c++
struct a {
operator int();
};
template<typename A>
struct b {
template<typename B, decltype(void(A{}.operator B()))* = nullptr>
auto func() {}
};
int main() {
b<a>{}.func<int>();
}
```
GCC and clang compile this code correctly, clang fails with:
```
<source>:7:40: error: no member named 'operator type-parameter-0-0' in 'a'
7 | template<typename B, decltype(void(A{}.operator B()))* = nullptr>
| ~~~ ^
<source>:12:5: note: in instantiation of template class 'b<a>' requested here
12 | b<a>{}.func<int>();
| ^
<source>:12:12: error: no member named 'func' in 'b<a>'
12 | b<a>{}.func<int>();
| ~~~~~~ ^
<source>:12:20: error: expected '(' for function-style cast or type construction
12 | b<a>{}.func<int>();
| ~~~^
<source>:12:22: error: expected expression
12 | b<a>{}.func<int>();
| ^
4 errors generated.
```
Compiler explorer link: https://godbolt.org/z/6on57GehY
This seems to only happen when the template parameter is not immediate context. Defining `struct b` as follows will make clang accept the code:
```
struct a {
operator int();
};
struct b {
template<typename A, typename B, decltype(void(A{}.operator B()))* = nullptr>
auto func() {}
};
int main() {
b{}.func<a, int>();
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8Vs2SqzYTfRp502UXSLZhFiwYPL71bb5Fkk2WQjRGuUIikpifLPzsqQaP7ZnyTN0kk6go7ALRfbr79GnJEPTBIhZsc882u4UcY-d8cfBSaeXionbNS1EZaQ8QEHuIDqyLgM-DtA3EDiFiPxgZEQbpZY8RPTx1aKHRHlU0L6CkMdoeQIJy9hF90M6CG9DL6DxoCz_v__f_8oHeRnyOK5bsWFLO959w8K4ZVdTOMlFev2LbZL4U4_d0TU9D9KOKIIFlpycAcO0tMp4zfsfE6TXLdpf_0_01ICaq-DKglT1CycTDGwf1lYNbH9wzXkGDytATxvNHpxvG85K-ynarM6D7E5zTVQITO7CjMUP0Z58gx-igHa2ad8Ns5aMAtI3QS22vNs9maiYqSVZnEJNBUVFOxMONtLxN87WHb1UFVH81EUO5ftAGIXY6gHINgnJ-Lj5lYd7USm0CPOnYXer4zrSoghu9QkIjyoyJcp0wUQJ67zz9sQ567Gv0QDlugPHsnEjK8_JMwWWyTBjPiF2MZ5Lx7EKGDFhW_QdFmxa5Oh6PwDYPN6NMORPlZg6OwJQEWdsQpY1axqlV2kuPKSNDoJDOpeQZePx9xBCxgQ49nr2nfPJO6y8U_gL7U8jT7dPKzHR9LcEV3vcA_xY4WsdpfY6Tv2UQPg-o4gxwsp1B6_zUWpTrZYgvBkHJEOHEKZKluedJgr4K-vU6Ho-fh8Bvh4DPg8cQbsD65yVfz_4CHNAS6bFZfSIH1SwAniAZ59GD0fY7ge1iHAI1PN8zvj-4pnYmrpw_ML7_g_H91tlN9g27X-Ha3i8kJDRuAs0bZ80LdHIY0M6T5YOpo8M0mnTfY6OnZjkNFNhhqy2NILZNXvWbbROQAVpnjHsiYTIGevkdT3IllcIhTq5I0T7SrC8YNzcGCsBNeSpJnv49sfqiITNx7w3pJCH9wSmzaArR3Ik7ucAizZK1SPgmzRddkTWtTEV918o2aWXbYqsUylrmLeZ5k24WuuAJXydpItKMp5t8td1ymbdpIlCou7VM2TrBXmqzMuaxJw4udAgjFtk2F9nCyBpNeD0G-YI2LevxENg6MTrEcPks6miwqKQlur055vzYCWcxelO86wwdu7FeKdczvidHp5_l4N1vqCLj-wlsYHw_4f0zAAD__6gGzEI">