Mark de Wever ba15d186e5 [clang] Use -std=c++23 instead of -std=c++2b
During the ISO C++ Committee meeting plenary session the C++23 Standard
has been voted as technical complete.

This updates the reference to c++2b to c++23 and updates the __cplusplus
macro.

Drive-by fixes c++1z -> c++17 and c++2a -> c++20 when seen.

Reviewed By: aaron.ballman

Differential Revision: https://reviews.llvm.org/D149553
2023-05-04 19:19:52 +02:00

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);
}