54 lines
1.7 KiB
C++
54 lines
1.7 KiB
C++
|
// 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);
|
||
|
}
|