<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/136700>136700</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang on windows reject recursive variant compare
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
neko-para
</td>
</tr>
</table>
<pre>
The following code can be compiled on windows with msvc and on linux with clang, but compiling with clang on windows (both with clang-cl or clang) results error.
The code is minified from [flutter windows embedder EncodableValue](https://api.flutter.dev/windows-embedder/encodable__value_8h_source.html)
[godbolt](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGIM6SuADJ4DJgAcj4ARpjEEgCcpAAOqAqETgwe3r7%2ByanpAiFhkSwxcVyJdpgOGUIETMQEWT5%2BXLaY9o4CdQ0ERRHRsXoK9Y3NOW0jvf0lZRIAlLaoXsTI7BzmAMyhyN5YANQmm24sTElH2CYaAIJbO3uYh8cAbg14hgQXV7dm2wy7XgORzcz2qRGIXxu3xGxC8Dn2ABVMCMjlYoTcvGkjIjkQQAGpvD5PAAi%2BxG6BAIFexHegmB5MpoIcJGBSJRm0uHNR32hBFh8LZBH2IH2SS8UVoeGQOJGBJpRJMAHY0dd9vsqDTXPsoqhPPtUElYkxwcCIGgGCMZZ8zAA2fa0BAKUj7c2WwXmO3ER3zQ7K75qtXETAEFYMMn1RzIAD6onZbldQsFctp1ptFwgDoUPuB4eNUpjTDjCatyY%2BHvTXqz3JuaqVxJ5ivrmxV30xoWAiJJ4YpIFO52Ogud7q5zZ5N1CQtOoQg2b9NYDCP2n1HUMbHEWtE4AFZeH4OFpSKhOG5rNYyctVo8tjxSARNOvFghMEwsHEZ6QANYgTZcAB0AA4NF%2BDR4niG0tw0f8KjMLd9E4SRd3vQ9OF4BQQA0W970WOBYBgRAUFQFgkjoWJyEoNAiJIuJnmQJIkijZ4KijAwCFxKNVBtaQaFoVjiDQiAoiQqJQgaABPTgb2E5hiFEgB5KJtDBCTeAothBFkhhaHE/deCwKIvGANwxFoNDuF0zBTiMcQdNIfAgxqUFTIPTBVGqLxWOU8hBA6JDJSiYgxI8LAkL5PAWE80FiB1JRiQswxgElIwsL4AxgAUPE8EwAB3WTDT3G9%2BEEEQxHYKQZEERQVHUGzdDaAwktMSxrH0PAojQyBFgNLoLU4AB6BlGqsSwzAPVBIppLB2vfKoamcCBXHGVpAgYdAZkGco8jSbrFr0FItoyNbSiGSYOjBWpRiaTwWmGU7ZoYHpGkOuZJgunaXumUIBiO8pFgUC81gWOCOB3Ug91Gzh9g4yR9hYBQaP2Rj4l/FjcX2CBcEIEhDl%2BLh5l4O8dPmR9n1fShFi/CCgYQ0hwspsHeCPDhUPQzDCdIHD8OWAgxQIMizUI4j6GIcJWHWVR/xtABaTj9mAZBpSkX8zF4TB8HBPAKTaQrhFEcQyu1yq1CQ2rSCygKkmUjdt0QmzGdk9yef1KhIZl2H4cR5HjVRiAPEooXsZ/PHWa0InSCfF8hnfTcOGp2mMPp5CmdsFmCZD8nv0kADOM2LcbUVDQuC3f9JEVWDo82G3waT1P13ZvCICQCjBdIih%2Bb9oZdnikauAw7jeP4wSbKksTPOHmT5MUhxPNUxgCA0rSkL0gyjNoEzPKwSyEvWA87LOxykJctyPLMrzWOjg8/ICmSgu3/GaXCk/IuizBYs3xLQDZqhUvSzKcryzztbFT1lxWQhtqoHl0AEeqxhTyWBam1eAnUkjdVMpLckRxiSDWsCNBm40NbIkQe0ToGQXArTestVan1ZjHU2gUTIV0Ji0O6k9GhM1uoPUutkJabDzofWKOtYYr0GHcIuiwn6SwVgA1xkDEGCdGaQwltLaGndsQjV/H%2BDQaMMbggDrjfGWF06bE2L%2BIxpizHmKppXBmKFk4YRrqHaOytQZIUZvowmixIppGcJIIAA%3D)
```cpp
#include <map>
#include <variant>
#include <vector>
struct Test;
using TestVariant = std::variant<std::vector<Test>>;
struct Test : public TestVariant {
friend bool operator<(const Test& lhs, const Test& rhs) {
return static_cast<const TestVariant&>(lhs) < static_cast<const TestVariant&>(rhs);
}
};
using T = std::map<Test, Test>;
int main() {
T t;
}
```
```
In file included from test.cpp:1:
In file included from C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\map:11:
In file included from C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\tuple:11:
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\compare(347,18): error: satisfaction of constraint 'requires { { _Left < _Right } -> _Boolean_testable; { _Right < _Left } -> _Boolean_testable; }' depends on itself
347 | requires requires {
| ^~~~~~~~~~
348 | { _Left < _Right } -> _Boolean_testable;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
349 | { _Right < _Left } -> _Boolean_testable;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
350 | }
| ~
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\compare(347,18): note: while substituting template arguments into constraint expression here
347 | requires requires {
| ^~~~~~~~~~
348 | { _Left < _Right } -> _Boolean_testable;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
349 | { _Right < _Left } -> _Boolean_testable;
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
350 | }
| ~
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\compare(367,42): note: while checking constraint satisfaction for template 'operator()<Test, Test>' required here
367 | using _Synth_three_way_result = decltype(_Synth_three_way{}(_STD declval<_Ty1&>(), _STD declval<_Ty2&>()));
| ^~~~~~~~~~~~~~~~
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\compare(367,42): note: while substituting deduced template arguments into function template 'operator()' [with _Ty1 = Test, _Ty2 = Test]
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\vector(2316,22): note: in instantiation of template type alias '_Synth_three_way_result' requested here
2316 | _NODISCARD constexpr _Synth_three_way_result<_Ty> operator<=>(
| ^
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\compare(321,62): note: while substituting deduced template arguments into function template 'operator<=>' [with _Ty = Test, _Alloc = std::allocator<Test>]
321 | decltype(_STD declval<const remove_reference_t<_Ty1>&>() <=> _STD declval<const remove_reference_t<_Ty2>&>());
| ^
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\variant(1366,51): note: (skipping 5 contexts in backtrace; use -ftemplate-backtrace-limit=0 to see all)
1366 | _NODISCARD constexpr common_comparison_category_t<compare_three_way_result_t<_Types>...> operator<=>(
| ^
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\compare(367,42): note: in instantiation of function template specialization 'std::_Synth_three_way::operator()<Test, Test>' requested here
367 | using _Synth_three_way_result = decltype(_Synth_three_way{}(_STD declval<_Ty1&>(), _STD declval<_Ty2&>()));
| ^
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\vector(2316,22): note: in instantiation of template type alias '_Synth_three_way_result' requested here
2316 | _NODISCARD constexpr _Synth_three_way_result<_Ty> operator<=>(
| ^
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\compare(321,62): note: while substituting deduced template arguments into function template 'operator<=>' [with _Ty = Test, _Alloc = std::allocator<Test>]
321 | decltype(_STD declval<const remove_reference_t<_Ty1>&>() <=> _STD declval<const remove_reference_t<_Ty2>&>());
| ^
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\variant(1366,51): note: in instantiation of template type alias 'compare_three_way_result_t' requested here
1366 | _NODISCARD constexpr common_comparison_category_t<compare_three_way_result_t<_Types>...> operator<=>(
| ^
test.cpp(11,49): note: while substituting deduced template arguments into function template 'operator<=>' [with _Types = <int, std::vector<Test>>]
11 | return static_cast<const TestVariant&>(lhs) < static_cast<const TestVariant&>(rhs);
| ^
In file included from test.cpp:2:
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\variant(1284,20): error: no matching function for call to object of type 'std::less<void>'
1284 | return _Op{}(_STD _Variant_raw_get<_Idx>(_Left), _Right._Val);
| ^~~~~
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\variant(611,23): note: in instantiation of function template specialization 'std::_Variant_relop_visitor2<std::less<void>, bool, int, std::vector<Test>>::operator()<std::vector<Test>, 1ULL>' requested here
611 | _STL_STAMP(4, _STL_VISIT_STAMP);
| ^
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\variant(656,44): note: in instantiation of function template specialization 'std::_Variant_raw_visit1<1>::_Visit<std::_Variant_relop_visitor2<std::less<void>, bool, int, std::vector<Test>>, const
std::_Variant_storage_<false, int, std::vector<Test>> &>' requested here
656 | return _Variant_raw_visit1<_Strategy>::_Visit(_Idx, static_cast<_Fn&&>(_Func), static_cast<_Storage&&>(_Obj));
| ^
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\variant(1321,21): note: in instantiation of function template specialization 'std::_Variant_raw_visit<const std::_Variant_storage_<false, int, std::vector<Test>> &, std::_Variant_relop_visitor2<std::less<void>, bool, int,
std::vector<Test>>>' requested here
1321 | && _STD _Variant_raw_visit(_Right_offset - 1, _Right._Storage(), _Visitor{_Left._Storage()}));
| ^
test.cpp(11,49): note: in instantiation of function template specialization 'std::operator<<int, std::vector<Test>>' requested here
11 | return static_cast<const TestVariant&>(lhs) < static_cast<const TestVariant&>(rhs);
| ^
C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\type_traits(2419,31): note: candidate template ignored: substitution failure [with _Ty1 = const std::vector<Test> &, _Ty2 = const std::vector<Test> &]: invalid operands to binary expression
('const std::vector<Test>' and 'const std::vector<Test>')
2419 | _NODISCARD constexpr auto operator()(_Ty1&& _Left, _Ty2&& _Right) const
| ^
2420 | noexcept(noexcept(static_cast<_Ty1&&>(_Left) < static_cast<_Ty2&&>(_Right))) // strengthened
2421 | -> decltype(static_cast<_Ty1&&>(_Left) < static_cast<_Ty2&&>(_Right)) {
| ~
2 errors generated.
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWkmXqrr2_zScCevUggCKgxqETrHHtnTiihAhCoSCYDd4n_2_ALXUqnPvuf937ztncFnWKk2zs7P3b3cJKMuIH2P8yikapxjfUM4Cmr7GeEe_JyhF39bUO71OAsxvaBjSA4l93qUe5l0U82vMuzRKSIg9nsb8gcQePWT8gbCAj7K9y6O47AhJnB-rZjdEsc8BnV_n7DK5IPnRd0-IA-qasuCu97sb8jS9UmnwKc7ykGU8TlOavnAC5ARYMFuySDI-IjHZEOzxm5RGPKdomzBnDKe3JXC0xp6HU96MXeqhdYhnKMwxpxgcUAPGkoyTIAcsDlgoIS-X6S8e3nPAuhD5fiXCAQtfyaxW-4LQSg1WGc1TF78ELAo50KiY5BTNp96ahuyrpS5dLzT1ywbpzElwsOj6AbS0d09x9CNcHIYLradH2sjTutASHd2FaGjqsHc-aKwH69A5WKznaCc48hsd5ixMeMrIWnDeoH5UNQ12qBZPIJzCVnKAvT20FpMxa_uiYcME6gvo5It8FzaWcHIwOlsPNq0pgx05a9q92jiHRls22j50tzIcJVvT9HU3gXDwDt_NiX_AUlrngAK0E4oTSKxgNz4c3dmp7SX-oDm1zUnPMecTpRzz1kWLBpV1zxHM0ag1yt5op7GQ-oO5sN1vhHA5smHYRfQtm9h17RzB3ik49ZUF7DtRBORsYoYtoC8QtNvrgZQvAtWFa1-UA995m9W9CBxO9Td_MDq7Z_A-atpvx1w6No-6asQAarOe3tuGCzpx983d1t7uHAc2k72hDCEkJX_HZk2DtoWPLexHmtJLqO22m9q4PYqEvNUfSSDQrEDtLrUWsFtgPFanM4qbzqDd1NrJqN2DrYXgeY199m5M3oYZfQ-GQzY1w8XueHB1u-k39d5yqZ4hBBskaLAz3dZdMD-8RQPJHElnp96pK-_szZxA01r0erE4OtvQqNF4uQ49J7NclogJsw6-QafDXJNxf5psJ8ZWR-y0KPfQ2k_e3s9SO0fvs2NbIfs0Os4k4UjnkLTb8iKxrYECBn7u1d-V81Lpi7rDBtTxwbrRXxj6EMRia9pbt8w5M2VoLXFLHljJuBMMmkraX5xcNqMq2x7HcNQf7C0_6JmHrGUuaw7sL_zJ0oWaAKHct0p2jJEck6bADsJG7Wx7Xa9hyuORJ-2dxsCSNceBwrxRF-YDbaH5Izi1HMvfbem8fTJpH5K2nbfjyGnbO7Jdyh2yhQfdOnb6M40hB1l0tiWGQyAlznvb8RHUhhN_DUwlIJbpa0qnzQxNn2BIWaBZuyBALZMDlof1Q8feN2H_cLRo38gt4axNSM91vL69gf7xfWpN7OFEmzXfu8f5YKoGGqy1jfaYLPyjrXbhrqsM4dxUBYtoYntEnOxw9M3QPmRdGR59OB2aqnmAmjSfGBOp2ShlYZqmc2wtOs7SNEfOrDVtnj0DwcOO9cbHtCUMId06J83y-13ancpQq2lh8z0bH85wONPsJOlqYL_pUBS5uvbWas4S6C88uNw1Xapux-vUSgXLZvTUX49Jc7wYbLV5MiJocphHzWl9SRetpLkb5Mu2n8foLY-mtkYGamL5U10V_flAH2jS1G-IzXPQ8OXTqBEsNAcNwWgrhxywrK37BnTNNW0zMMJyS91ACeWB6g2jUSMWN-PAIhywdN1fOEJwyJKshfWhEUyHztnQPbtlqIM59I-O3SPnqS1va03bbc9b89mIA9aRQQ1Nto0ILrVkvHtTz5Y80dSWNoSdCXLSwDJd55SLp3dRd0A61k9-ZxdNtx4TnOjc9HaNE96IncBehqAluyOltZ2NCByalL5lSw5Yw9YcCXY81jeWGsSbiTtoJiDqDRNFj7zMivSlocZ7YQeNQQ903fV0Zji5Lm0abXM2N6gKmtIBTcShKC33uq07-lbzbBKUklg36NKLyQ7l8FDf4qF8GK87u2wyHLSiidKbBsdhf3r0dSik411X8E_bPjXPw85hfDL3c6jWu4Pjadd22WnY7aXn-WDrqxywbD0a-7nEAauJ3vRd0ZKTs7bIpGPXMZbvwXQ_Pnfc9HQ-s7U1EcPj3AnYO22FAjTx-zGYnOYaikQM4-lu6816SdfdjY5kbMwzva9FstBf2zsHCxPadN5gOsEZm6FYXG5bU-BPJ_ZMaBNhUNs1mkFPzOlwmrNdG62NM93MOwO2WKRCs-XaOTnEtfFh5kPxuDPMpu41kXMIWRc1Yy9ztjMOWK3KIzio11v7vpFuN825JdTWJuiWPfYxIedW1EmSNy3qWDt5MUrfW2hwYs7Sni739BCRo50kTbdt2xByQJGMj0hbE6qPmyTFTyCR2A1zD_OcpEco4STzU_MepQTF7Msu7DKaXnoEmLE0dxlfSIeTtKotz4qUphJYSYfnJIPPmFfEdwneiOsfTReiekXHLD_apxV4ToJ8kq9D4j6SrxdjeX6TEhx7_JrSkKcJTlFFlAOqS-PswiWo8WGQFSnYY2NaNDautFLM8jTmM4YYcVcuKtjSPyZcVuZArWAVqOFlsqT_9JRqvWqbPM_VjWK7deNZio-yK_VVSQno_E1alykkZnyESMwB9W4rPM9P-Kt2qmWukHhCCCdAO-Y3JMT8ReOXxJHhjL0U-JGgWDDyo3F60anow5T6KYp4i4Q44xS9R9yUZnTD-BnJchTyY5Z7hHKKDgQAqgkbnGWExijkFH2mc4o-oTQsJ4_Ln6L8IksvkqwKKqfol2U5pUIwFH83tliehPiOsV_AQlFdoBRzQJXkOgd0US3xBqtiofiSIUayDXIZoTFPN5VBpKiAEQfqKX7PSYqzAkfl36qLN6zE-GpE_KCwO4P_zkkmv9IoDTGKVwVQiuyfky5TLgOLOdXsP5licKDOezjBsZcVpRBhGQ43JYwluc5zdZ2_Pjf-7hm9AJ4vR3KK-Z_rcyGhPpCoBv7VnRWknqn85yefCxuNir-_LKGH7f21NRXhgenKE9wR-81AGlNW2A9_CAp7zvJ1xgjLWeETGY6SEDHMo9TPIxyzjCcxo_fwxcckrTjiA5ziYqd_HT6fnmc8_X1w-n_q9IKjT-v_i6kLpmoFpmTwJabcALu76jznhpsHj7ih6QfWOFC_pRSgAumnOAzqVzB5N9jxUq3CXRXPV-NTzIIVC1KMVwd0WlUnOGWU97AbslNSMP48rIBm4RvV1XhSDdyjkJP01eQk3jKKgimg85-HgMchjY-840uY_-i5h_8NBb-vfh98hoe93MXeD33HJo8rpf-BwkGd5xStPIwr5F7q7AqBQsofDYrxayRzyaOBCiSxxgEdPEuGxDyJM4ZiRtA16t92XGCPRyFBWbH5HyD1CnKcsTuUF-uVYFr1B4Y91uHIqMyqcMQ_An0FzsIt3SfrknGB6h-64gsefzkAgcgBvfaPA_BDLg8YfIQgDEPqPtYLqGhCj7WVUjlpCYilaB-8zoPnqGqXFEd0j1cp3uAUxy5esavfKdj58Cv8jclnD_THdMATnbuiiP_I436RPV1rNlWUaoVBKeKTpjmgZjuSJIWKlQLyDB9LlfJr5O5Yitwysc0zzH_fXFX7_db3PSQRYZxkCDyjfIYL-7sckvPFkj-2KZdGEY1XFRRJVnxFDPs0Pa2qurOE6Cebu0o9wRknmS8vLz9lfr-DpX3t6r9yaJ9NKUuwS1BIztUYDtRvFvIp0patPxvqH73g7x3rf702_w1P_4anf8PT_zI8_QWD-oOI8aVN_Xbh6XZICVSxgL3c-EWwT3BWwpyTdBKX2P_Dg-4K8KJ48yT_67PnRzH-6Qkw-GUnmnd4B6pcBBDh-UgzpnyEmBsUyr0pryjkXRSGRY5F11vsstIOCvjfpwIhzjJO0veUeJVSS70AVf7k4y8aWg2Sx2C9ugh6laLDysclmG3vWAm9PIq5xu3yhOZlNUPhF4r4ce39q-VeKy0LSH97FnYTHA5pstqTjDCagvs7omft6OU9T_H_Z4zs66zux1OAzovTbveHqV7tzl6LZzWedFfjCewNuQqaVcvMHtuTa_vvGDhqShE3ZPmfUyg6VOoUOUkXb6pYzYq2exX84xC43vjdVPB56YzRFPl4xUn6BoUZ_knS_NWxflkU1JTas2v_WjqrMUuLIHl6lhJQSy8Cnh38yoqLla9efWXlsXtxME8Dx9XGHkYP1tvfOJ8pM1fwM_nMf4nLW6D8e-FwP-ZvgPZn0H7p5X6AQfGaTT-ElBIM_OfAtb-CrgxSK7rZZJjx33nxPnLdEHUrRWfVtri6Vka65yF144_Q9qfJ23-t-Yes7acSs6_N-ffJ1H7FtfYpwSuWIsKyooyXxUL10rOVuij2iFeWGFfFED-mKfbKW-dbAl6kZoiEeYo_H6w_2eSzfq42djt3_5nxilEhaY9C4lVlRexlRVa4JjFKT3fXhh_iLtBb_xPqBVRQ7PE_NfJyvFcI7wakL2solBf56tMdhHo9BipMt8ooKylc20r7LGD2GOz-_KanAhUPZFDd6sUUH12cFJ7g7utTYLkx85jjfoHxDx4vQ6-MVh--evOXz1iKY58FOMbehZ1H11XeY96dCvwjDH26Cy4yb1CVGRnv47hQCvZent6e-ea9Sl5DaqBv-FWsy4okCbWG-i14VSVBwJLXcJG0QaDWwKAhKptNQ6ytZREJ62_kFQhAEWQARFmQFfVFEbAMJCDLsiTUsYQ5WcARIuFLGO6jF5r630iW5fhVlGp1QfgWojUOs_ItdgAur4cDTjG-pa_FhO_r3M84WQhJxrIPEoywEL_qz--dp7iskVLs5mlG9pi_BGb-UrZ_y9Pw9emNbcKCfP3i0ogDVkH_8u97ktKCGAeskt-MA9aF5f0r-L8AAAD__8QZz30">