<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/155647>155647</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang or MSVC Compilation Fails, but GCC Succeeds
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
lgztx96
</td>
</tr>
</table>
<pre>
~~~cpp
#include <variant>
#include <vector>
struct A { int a; };
struct B { int b; };
template <class T>
concept ordered = requires(const T & t) {
{ t <=> t };
};
template <class T>
struct tuple_elem
{
static inline T value{};
auto operator<=>(const tuple_elem&) const = default;
constexpr auto operator<=>(const tuple_elem& other) const
requires(std::is_reference_v<T>&& ordered<T>)
{
return value <=> other.value;
}
};
template <class T>
struct tuple : tuple_elem<T> {
auto operator<=>(const tuple&) const = default;
};
int main()
{
tuple<const std::vector<std::variant<A, B>>&> left;
auto& v = left.value;
(void)v;
return 0;
}
~~~
For the following example, when using Clang or MSVC with the C++20 standard, compilation fails because P2944R3 is not implemented. However, GCC 10 compiles it successfully, It appears that it does not attempt to instantiate the comparison function.
Is this expected behavior?
https://godbolt.org/z/hzrEfY83z
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyclE-PqzYUxT-Ns7l6EdgJSRYsCBnat6hU9Y0qdTUy5hJcOTa1L8y8WeSzV4b8m75Fp80myNc-9_h3LsgQ9NEi5my9Z-vDQg7UOZ-b4zu97bJF7Zrv-fl8Vn3PkoJxoa0yQ4PARDlKr6UlJp5-LKEi5y-VpAjkB0VQANvsQVsCycQe2ObAxP5e3t_K9YcySwrCU28kTdrKyBDgeRZXzirsCZxv0GMDTBzA41-D9hgY3ypnA8EzMJ4BMb6LHVhSAMDUi6IeEwcmnuLzreFnOl9M09AbfEGDp-ngVT2QJK1AW6MtwjOM0gwYy1fpuEkO5MD16OUE6-LkZvtBmmfR_Lwcr9hgKwdDN5dzCd96_59EwVGH_iYdhR7gBWqYKJgodHjx2KJHq_BlZKKcEERP2RX8bXF3x3t5ij-PNHg7U3hgPrVfzmzEPZjD_8kAmCgebzcbevDxGTD_AvrBUxzTk9SW8e186XujWUmUs8qN4vWdKO8r1xeoLBgvYR_tzGDFExhs6eOoRNzj5CrWfsDGt6PTDeO78T4Wd_TJ_QpJcT6fWVJUzgN1CK0zxr1qewR8k6eJQgmvHVoYQlwtjbRHcB5--fZ7Ca-auulYyfie8T1P4rDbRvomnlPu1GsjSTsLrdQmQI1KDgHhV75brX4ToANYR6BjpxNawmYJP7tXHOMklvBTWUKaXHQwgCYIg1IYQjsY8z1u-Uog-x6lD0CdpLilcTjLSorTQkAOtI3GSMfJiYajpPQ6RGeDVdHikiXF16iiA-Bbj4qwgRo7OeoYVcWSoiPqQ8yLV4xXR9fUztDS-SPj1TvjVffun9o_tuJ90eSi2YmdXGCebtaZSNN0lS66fJskos7SzVpu1Eoo3PLdqk43LfIVz1rMFjrnCV8nW75Js5TzdKl2bYaYqWwtkjaTGVsleJLaLI0ZT7H3QocwYJ6u19lqszCyRhOmLzjnKqbFOI8fc5_HA1_q4RjYKjE6ULhLkCaD-cdwy4f0qphexF0PNKXyLcaATVgM3uT_wKKpG-qlcifGq9jh8vel9-5PVMR4NTkOjFcX02PO_w4AAP__3AH-Jw">