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
14enum Enum : int {};
15enum class EnumClass : int {};
16
17static_assert(std::__libcpp_is_trivially_equality_comparable<int, int>::value, "");
18static_assert(std::__libcpp_is_trivially_equality_comparable<const int, int>::value, "");
19static_assert(std::__libcpp_is_trivially_equality_comparable<int, const int>::value, "");
20
21static_assert(std::__libcpp_is_trivially_equality_comparable<unsigned int, unsigned int>::value, "");
22static_assert(std::__libcpp_is_trivially_equality_comparable<const unsigned int, unsigned int>::value, "");
23static_assert(!std::__libcpp_is_trivially_equality_comparable<unsigned int, int>::value, "");
24
25static_assert(!std::__libcpp_is_trivially_equality_comparable<std::int32_t, std::int64_t>::value, "");
26static_assert(!std::__libcpp_is_trivially_equality_comparable<std::int64_t, std::int32_t>::value, "");
27
28static_assert(std::__libcpp_is_trivially_equality_comparable<int*, int*>::value, "");
29static_assert(std::__libcpp_is_trivially_equality_comparable<int*, void*>::value, "");
30static_assert(!std::__libcpp_is_trivially_equality_comparable<int*, long*>::value, "");
31
32static_assert(!std::__libcpp_is_trivially_equality_comparable<Enum, int>::value, "");
33static_assert(!std::__libcpp_is_trivially_equality_comparable<EnumClass, int>::value, "");
34
35static_assert(!std::__libcpp_is_trivially_equality_comparable<float, int>::value, "");
36static_assert(!std::__libcpp_is_trivially_equality_comparable<double, long long>::value, "");
37
38static_assert(!std::__libcpp_is_trivially_equality_comparable<float, int>::value, "");
39
40static_assert(!std::__libcpp_is_trivially_equality_comparable<float, float>::value, "");
41static_assert(!std::__libcpp_is_trivially_equality_comparable<double, double>::value, "");
42static_assert(!std::__libcpp_is_trivially_equality_comparable<long double, long double>::value, "");
43
44static_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 "");
48static_assert(std::__libcpp_is_trivially_equality_comparable<char16_t, std::uint_least16_t>::value, "");
49
50struct S {
51 char c;
52};
53
54struct S2 {
55 char c;
56};
57
58struct VirtualBase : virtual S {};
59struct NonVirtualBase : S, S2 {};
60
61static_assert(!std::__libcpp_is_trivially_equality_comparable<S*, VirtualBase*>::value, "");
62static_assert(!std::__libcpp_is_trivially_equality_comparable<S2*, VirtualBase*>::value, "");
63
64// This is trivially_equality_comparable, but we can't detect it currently
65static_assert(!std::__libcpp_is_trivially_equality_comparable<S*, NonVirtualBase*>::value, "");
66

source code of libcxx/test/libcxx/type_traits/is_trivially_comparable.compile.pass.cpp