<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/136464>136464</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang checks impossible cast
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
vzze
</td>
</tr>
</table>
<pre>
### Issue
Clang tries to check if cast of `const char*` is ill-formed even though the context of the cast is reduced to only `int` by `if constexpr`
<details>
<summary>Code</summary>
```c++
// main.cc
#include <type_traits>
#include <variant>
int main() {
using type = std::variant<int, const char*>;
type a = 12;
type b = 42;
int res = std::visit([&](auto a1) -> int {
return std::visit([&](auto b1) -> int {
if constexpr(
std::is_same_v<std::decay_t<decltype(a1)>, std::decay_t<decltype(b1)>> &&
std::is_same_v<std::decay_t<decltype(a1)>, int>
)
return int(a1) + int(b1);
else
throw "Wrong type!";
}, b);
}, a);
}
```
<details>
<summary>Unix Error</summary>
```
main.cc:16:24: error: cast from pointer to smaller type 'int' loses information
16 | return int(a1) + int(b1);
| ^~~~~~~
main.cc:11:47: note: while substituting into a lambda expression here
11 | return std::visit([&](auto b1) -> int {
| ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../include/c++/14.2.1/bits/invoke.h:61:14: note: in instantiation of function template specialization 'main():
:(anonymous class)::operator()<const char *>' requested here
61 | { return std::forward<_Fn>(__f)(std::forward<_Args>(__args)...); }
| ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../include/c++/14.2.1/bits/invoke.h:96:19: note: in instantiation of function template specialization 'std::__
invoke_impl<int, (lambda at main.cc:10:26), const char *&>' requested here
96 | return std::__invoke_impl<__type>(__tag{}, std::forward<_Callable>(__fn),
| ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../include/c++/14.2.1/variant:1060:16: note: in instantiation of function template specialization 'std::__invo
ke<(lambda at main.cc:10:26), const char *&>' requested here
1060 | return std::__invoke(std::forward<_Visitor>(__visitor),
| ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../include/c++/14.2.1/variant:1820:5: note: in instantiation of member function 'std::__detail::__variant::__g
en_vtable_impl<std::__detail::__variant::_Multi_array<std::__detail::__variant::__deduce_visit_result<int> (*)((lambda at main.cc:10:26) &&, std::variant<int, const cha
r *> &)>, std::integer_sequence<unsigned long, 1>>::__visit_invoke' requested here
1820 | _GLIBCXX_VISIT_CASE(1)
| ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../include/c++/14.2.1/variant:1811:4: note: expanded from macro '_GLIBCXX_VISIT_CASE'
1811 | __visit_invoke(std::forward<_Visitor>(__visitor), \
| ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/14.2.1/../../../../include/c++/14.2.1/variant:1882:18: note: in instantiation of function template specialization 'std::__do_v
isit<std::__detail::__variant::__deduce_visit_result<int>, (lambda at main.cc:10:26), std::variant<int, const char *> &>' requested here
1882 | return std::__do_visit<_Tag>(
| ^
main.cc:10:20: note: in instantiation of function template specialization 'std::visit<(lambda at main.cc:10:26), std::variant<int, const char *> &>' requested here
10 | int res = std::visit([&](auto a1) -> int {
| ^
1 error generated.
```
</details>
<details>
<summary> Win11 Error </summary>
```
.\main.cc:16:24: warning: cast to smaller integer type 'int' from 'const char *' [-Wpointer-to-int-cast]
16 | return int(a1) + int(b1);
| ^~~~~~~
.\main.cc:11:47: note: while substituting into a lambda expression here
11 | return std::visit([&](auto b1) -> int {
| ^
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\include\type_traits:1706:16: note: in
instantiation of function template specialization 'main()::(anonymous class)::operator()<const char *>' requested
here
1706 | return static_cast<_Callable&&>(_Obj)(static_cast<_Ty1&&>(_Arg1), static_cast<_Types2&&>(_Args2)...);
| ^
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\include\variant:1422:25: note: in
instantiation of function template specialization 'std::invoke<(lambda at ./main.cc:10:26), const char *&>'
requested here
1422 | return _STD invoke(static_cast<_Callable&&>(_Obj),
| ^
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\include\variant:1492:23: note: in
instantiation of function template specialization 'std::_Variant_dispatcher<std::integer_sequence<unsigned long
long, 2>>::_Dispatch2<int, (lambda at ./main.cc:10:26), std::variant<int, const char *> &, false>' requested here
1492 | _STL_STAMP(4, _STL_VISIT_STAMP);
| ^
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\include\variant:1546:49: note: in
instantiation of function template specialization 'std::_Visit_strategy<1>::_Visit2<int,
std::_Meta_list<std::integer_sequence<unsigned long long, 0>, std::integer_sequence<unsigned long long, 1>,
std::integer_sequence<unsigned long long, 2>>, (lambda at ./main.cc:10:26), std::variant<int, const char *> &>'
requested here
1546 | return _Visit_strategy<_Strategy>::template _Visit2<_Ret, _ListOfIndexVectors>(
| ^
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\include\variant:1591:17: note: in
instantiation of function template specialization 'std::_Visit_impl<3ULL, int,
std::_Meta_list<std::integer_sequence<unsigned long long, 0>, std::integer_sequence<unsigned long long, 1>,
std::integer_sequence<unsigned long long, 2>>, (lambda at ./main.cc:10:26), std::variant<int, const char *> &>'
requested here
1591 | return _STD _Visit_impl<_Size, _Ret, _ListOfIndexVectors>(
| ^
.\main.cc:10:20: note: in instantiation of function template specialization 'std::visit<(lambda at ./main.cc:10:26),
std::variant<int, const char *> &, void>' requested here
10 | int res = std::visit([&](auto a1) -> int {
| ^
1 warning generated.
```
</details>
</details>
### Test Reproduction
* tested on both `linux` and `win11`
```
clang++ main.cc -std=c++17 -o main
```
### Clang Version
#### Arch Linux
```
clang version 19.1.7
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
```
#### Windows 11
```
clang version 20.1.3
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Users\****\scoop\apps\llvm\20.1.3\bin
```
### Additional information
* compiles just fine with `gcc`
```
g++ main.cc -std=c++17 -o main
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWl1v4rrW_jXujQVKnA_ggos0La8qdbS3djudfRc5iQHPODav7dB2Ls5vP1p2wldpS4-YPT3SQaglib28vJ5nfRmoMXwhGZui5BIlVxe0tUulp-ufP9lFqernKSKRf-MbY1qGggwFWS6oXGCrOTPYKlwtWfUD8zmuqLFYzTFKg0pJY3G1pBqRDKUB5gZzIQZzpRtWY7ZmEtulahdLbJcMV0pa9uQmu0sQxA3WrG4rVsMiSopnEMylBXGlv5hjtxB7WmmUBl47FOU1s5QLg6Jrf23apqH6GUXXuaoZinJEZtt73bQ08O8KkUt4BxkiM0RmuKFcDquqG0YiLivR1gyjKLfPK1ZYTbntF9t7vKaaU2k3a3BpnTRExohMMBrBKrg1HMz5vII5V9jYGkUZirLN7Bw2TXK8b9ToGkWXXi7G2M-nTkJI_JPN7dLdjsneBFBGM3OwJjfcgnrJJSIpSq4QGdPWKkxD0HiAoms3sVO9e2lmWy1PkFK-JcUptYsoGcPTjVRuCkMbVqwB0f5mzSr6XFgHeiVgt7AWLAMGIjl-e2TZj4yuMahK0jMsyXvId3cGj4OsN5VD1E_CiFx21502h0ZhwoDnYbvU6hEjQr5p1TEGkRARsj8Fja5Ai3JPVneTbm7CjR3Wn-A7XyV_wtdaK_2OB6Eg630mysIURRmJUZRh5udm3r_nWjV4pbi0TIOHm4YKAR-dI5CRM8kIC2WYwVxC5KCWK-k3FKYYjXJ8-PqYeY9J6I2YXP_LvfY3E6Ioi0ewB6ksg_-PSy4YNm1pLLetBVfmEhwGC9qUNcVAZWYMVxIvmWad-uHe4udwIJCHEh-EZq3RiMxKCDWz4RCRmeBlGiMyW1QVIrOncVqk8WBVDQSX7dNgIVtEZmE8JMOwn3HwpwtriMz6ALkzoYQACGPW6gcbLlGUpWCpMN61FAdcjKXScgckRPt5Kyv32bJmJahl2KxYxangP_0YREbbiAnGAVJmYA6p5HOjWoMrQY3pnkaZWjFNrdL9jHwbNXEXNskIa_b_LTOW1TuYpFtM0OjyBSZzpR-prlGUFzPpxIyLYg5rkPGxQZlemH4Yhc9kMgRLAgOx975PhtkEXDWcnAOzjUGKwuU9WKPgzUpssxki485DqMU7LhZAvEidXXdTngOPpG_gN9kNCYfoFcW-EkXhwmeHj6ULcCUfI4-BmVMhaCk2E-bSK_gpvG9TKGRhkAZ9zD0nhmA7FGQ_fO10VtxA5YNA_Bp2rzjaAwRLSCwemnV3ucHnk0AzJmCh5D1kGtaUTG8B2gfCZ-f-aivdXS5QkDFZrC0wtSf6iZO_tMLygmpNn0-fVNSuQPcmLzQzrejLVVdPjR32E_fhHdL01deu_71eAKMg66O5n_ii2oOyYsF0YYBwsgLittI1OzUWSi5gcOgLv83e3C56qh3l6pgccrV_Ff93e3OZ__138XBzd3Nf5NkdsDHsqr7PFCLGvojZ5SF7WlFZs9rXZA2ttALeHd3TyBuiK2AOrfZhBz0ouj5dQB2Pift35oBaq2INiRHKvPO428kp9ZT-cte3Xg3c4zF54QwvQzfstNtmcU8XngRHUD5UNzirxXsV_lELYRxuw8XZ2u1XmhZvxdA3WXjBJJTBrB4eNnmuddtv8t7p-_A3LsPQd374_dZviJL8aPv3SLXkcrFpAHd6vi5aH_Z-LhwhMjqsJkYYJZeDb13zOLBqwKUdgFAw4W5_-PF-cLfxO9jKf0Xzl4OQJP9Tq4WmDZ5xwQxK8i-80sqoucUP3LRU4Dvb1lyhJCcBISjJc9U0reT2GSX5Q46S_F4p4WbeucswHsbRMIrHwRgleR8-k_0jsCwcBemRAnSj5xkawHN2fxu9NkFtFKTHwaGWV4Wj2G474IsWn9j-KL_33eDe4PvncG9cphfhJtIcjFwxQw4Hw51t6_hWHPg9DNjJljGBbEmSc6K_U9K5GuMgiEMy_2AXstHnSFKLyatJrbi7v8I7hc7pjDhW1fxOlCYOpeiXoFQ8-IWKmpsVtdWS6d0K5926vNeiL9LJXpF-1Qklr5wjvMWGj6Z1kuM5FYa9XgHFk32yFHf3t8XdffblT0TGMQhwd3z53N0_8QDyt5MkiSGGx5NfRBJXwhoLNcoCOs5wi7F7tgV470C--MIsLQQ39iOk2pAp-GibuN8rHihz8uSew7-Sre9GtiTeZrY-or2AobjbfO7g2MC5xaX4izlFiltu7B_zG1mzpwdWWaXNtrx_42z91dfvJ_3EHVuPfiXpu3OZ6Ovtbf9l0f9IfjaST8IXJIe0vW_74o7_ZI7BpzD5IHEfNAX_VLP6hhn38Do9ua0Vrz9X79p1iG90r280sMfubn69cM-MxX-xlVZ1W3XfIroBGbZ-40riUtklRmngDpFQGmAqa7h-hP53q8COPpWgQP5L6Ck7cPDAWeiqO1YKR3ig_Jf-L7eyUc__ouKBabOjWrR9nulqiW-dWsd1wGs_F4eTYTgEF7mnesEgqOFjp2NBdr_UjNa4UTUTMGqlDAfpN0BdIVh9xd13tXunb69vAbT8xmWtHg0Ow_e0JMEwHEavaPnoxQwas64-oGiXNr4apiHou4K_fye5qZRaoSSnqxU8FWLduMzh9EjytzeHs7rmwBoqDr6J7jhUqWYFaQp_b43Fcy4ZfuSeTIuqOkqd_4Q2F_U0qifRhF6waTiKkzBIJ8HoYjkdl5TM0zKpyqSqWMmiiKajKhgTmtZ1kpALPiUBSYI4nJAoSYJ0GEZlWlZRTcukqlmUoDhgDeViCJYZKr244Ma0bBpGaZzGF4KWTBj3MyFCOtYTlFxd6ClMGJTtwqA4gJxltiIst4JNPbndr4QM5s1KGcNL4X_lc9FqMV1auzKur58hMltwu2zLYaUaRGYOJ_9vsNLqO6ssIjOnmkFk1mm3npJ_BwAA__88sLgk">