1 | //===----------------------------------------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include <__type_traits/conditional.h> |
10 | #include <__type_traits/is_equality_comparable.h> |
11 | #include <__type_traits/is_signed.h> |
12 | #include <cstdint> |
13 | |
14 | enum Enum : int {}; |
15 | enum class EnumClass : int {}; |
16 | |
17 | static_assert(std::__libcpp_is_trivially_equality_comparable<int, int>::value, "" ); |
18 | static_assert(std::__libcpp_is_trivially_equality_comparable<const int, int>::value, "" ); |
19 | static_assert(std::__libcpp_is_trivially_equality_comparable<int, const int>::value, "" ); |
20 | |
21 | static_assert(std::__libcpp_is_trivially_equality_comparable<unsigned int, unsigned int>::value, "" ); |
22 | static_assert(std::__libcpp_is_trivially_equality_comparable<const unsigned int, unsigned int>::value, "" ); |
23 | static_assert(!std::__libcpp_is_trivially_equality_comparable<unsigned int, int>::value, "" ); |
24 | |
25 | static_assert(!std::__libcpp_is_trivially_equality_comparable<std::int32_t, std::int64_t>::value, "" ); |
26 | static_assert(!std::__libcpp_is_trivially_equality_comparable<std::int64_t, std::int32_t>::value, "" ); |
27 | |
28 | static_assert(std::__libcpp_is_trivially_equality_comparable<int*, int*>::value, "" ); |
29 | static_assert(std::__libcpp_is_trivially_equality_comparable<int*, void*>::value, "" ); |
30 | static_assert(!std::__libcpp_is_trivially_equality_comparable<int*, long*>::value, "" ); |
31 | |
32 | static_assert(!std::__libcpp_is_trivially_equality_comparable<Enum, int>::value, "" ); |
33 | static_assert(!std::__libcpp_is_trivially_equality_comparable<EnumClass, int>::value, "" ); |
34 | |
35 | static_assert(!std::__libcpp_is_trivially_equality_comparable<float, int>::value, "" ); |
36 | static_assert(!std::__libcpp_is_trivially_equality_comparable<double, long long>::value, "" ); |
37 | |
38 | static_assert(!std::__libcpp_is_trivially_equality_comparable<float, int>::value, "" ); |
39 | |
40 | static_assert(!std::__libcpp_is_trivially_equality_comparable<float, float>::value, "" ); |
41 | static_assert(!std::__libcpp_is_trivially_equality_comparable<double, double>::value, "" ); |
42 | static_assert(!std::__libcpp_is_trivially_equality_comparable<long double, long double>::value, "" ); |
43 | |
44 | static_assert(std::__libcpp_is_trivially_equality_comparable< |
45 | char, |
46 | typename std::conditional<std::is_signed<char>::value, signed char, unsigned char>::type>::value, |
47 | "" ); |
48 | static_assert(std::__libcpp_is_trivially_equality_comparable<char16_t, std::uint_least16_t>::value, "" ); |
49 | |
50 | struct S { |
51 | char c; |
52 | }; |
53 | |
54 | struct S2 { |
55 | char c; |
56 | }; |
57 | |
58 | struct VirtualBase : virtual S {}; |
59 | struct NonVirtualBase : S, S2 {}; |
60 | |
61 | static_assert(!std::__libcpp_is_trivially_equality_comparable<S*, VirtualBase*>::value, "" ); |
62 | static_assert(!std::__libcpp_is_trivially_equality_comparable<S2*, VirtualBase*>::value, "" ); |
63 | |
64 | // This is trivially_equality_comparable, but we can't detect it currently |
65 | static_assert(!std::__libcpp_is_trivially_equality_comparable<S*, NonVirtualBase*>::value, "" ); |
66 | |