| // RUN: %clang_cc1 -mllvm -emptyline-comment-coverage=false -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -std=c++23 -triple %itanium_abi_triple -main-file-name if.cpp %s |
| |
| // No crash for following example. |
| // See https://github.com/llvm/llvm-project/issues/45481 |
| namespace std { |
| class strong_ordering; |
| |
| // Mock how STD defined unspecified parameters for the operators below. |
| struct _CmpUnspecifiedParam { |
| consteval |
| _CmpUnspecifiedParam(int _CmpUnspecifiedParam::*) noexcept {} |
| }; |
| |
| struct strong_ordering { |
| signed char value; |
| |
| friend constexpr bool operator==(strong_ordering v, |
| _CmpUnspecifiedParam) noexcept { |
| return v.value == 0; |
| } |
| friend constexpr bool operator<(strong_ordering v, |
| _CmpUnspecifiedParam) noexcept { |
| return v.value < 0; |
| } |
| friend constexpr bool operator>(strong_ordering v, |
| _CmpUnspecifiedParam) noexcept { |
| return v.value > 0; |
| } |
| friend constexpr bool operator>=(strong_ordering v, |
| _CmpUnspecifiedParam) noexcept { |
| return v.value >= 0; |
| } |
| static const strong_ordering equal, greater, less; |
| }; |
| constexpr strong_ordering strong_ordering::equal = {0}; |
| constexpr strong_ordering strong_ordering::greater = {1}; |
| constexpr strong_ordering strong_ordering::less = {-1}; |
| } // namespace std |
| |
| struct S { |
| friend bool operator<(const S&, const S&); |
| friend bool operator==(const S&, const S&); |
| }; |
| |
| struct MyStruct { |
| friend bool operator==(MyStruct const& lhs, MyStruct const& rhs) = delete; |
| friend std::strong_ordering operator<=>(MyStruct const& lhs, MyStruct const& rhs) = default; |
| S value; |
| }; |
| |
| void foo(MyStruct bar){ |
| (void)(bar <=> bar); |
| } |