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// UNSUPPORTED: c++03
10
11// Check that type traits derive from integral_constant
12
13// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS
14
15#include <cstddef>
16#include <type_traits>
17
18#include "test_macros.h"
19
20static_assert(std::is_base_of<std::false_type, std::is_void<int>>::value, "");
21static_assert(std::is_base_of<std::true_type, std::is_integral<int>>::value, "");
22static_assert(std::is_base_of<std::false_type, std::is_floating_point<int>>::value, "");
23static_assert(std::is_base_of<std::false_type, std::is_array<int>>::value, "");
24static_assert(std::is_base_of<std::false_type, std::is_enum<int>>::value, "");
25static_assert(std::is_base_of<std::false_type, std::is_union<int>>::value, "");
26static_assert(std::is_base_of<std::false_type, std::is_class<int>>::value, "");
27static_assert(std::is_base_of<std::false_type, std::is_function<int>>::value, "");
28static_assert(std::is_base_of<std::false_type, std::is_pointer<int>>::value, "");
29static_assert(std::is_base_of<std::false_type, std::is_lvalue_reference<int>>::value, "");
30static_assert(std::is_base_of<std::false_type, std::is_rvalue_reference<int>>::value, "");
31static_assert(std::is_base_of<std::false_type, std::is_member_object_pointer<int>>::value, "");
32static_assert(std::is_base_of<std::false_type, std::is_member_function_pointer<int>>::value, "");
33static_assert(std::is_base_of<std::true_type, std::is_fundamental<int>>::value, "");
34static_assert(std::is_base_of<std::true_type, std::is_arithmetic<int>>::value, "");
35static_assert(std::is_base_of<std::true_type, std::is_scalar<int>>::value, "");
36static_assert(std::is_base_of<std::false_type, std::is_object<int&>>::value, "");
37static_assert(std::is_base_of<std::false_type, std::is_compound<int>>::value, "");
38static_assert(std::is_base_of<std::false_type, std::is_reference<int>>::value, "");
39static_assert(std::is_base_of<std::false_type, std::is_member_pointer<int>>::value, "");
40static_assert(std::is_base_of<std::false_type, std::is_const<int>>::value, "");
41static_assert(std::is_base_of<std::false_type, std::is_volatile<int>>::value, "");
42static_assert(std::is_base_of<std::true_type, std::is_trivial<int>>::value, "");
43static_assert(std::is_base_of<std::true_type, std::is_trivially_copyable<int>>::value, "");
44static_assert(std::is_base_of<std::true_type, std::is_standard_layout<int>>::value, "");
45static_assert(std::is_base_of<std::true_type, std::is_pod<int>>::value, "");
46static_assert(std::is_base_of<std::false_type, std::is_empty<int>>::value, "");
47static_assert(std::is_base_of<std::false_type, std::is_polymorphic<int>>::value, "");
48static_assert(std::is_base_of<std::false_type, std::is_abstract<int>>::value, "");
49static_assert(std::is_base_of<std::true_type, std::is_signed<int>>::value, "");
50static_assert(std::is_base_of<std::false_type, std::is_unsigned<int>>::value, "");
51static_assert(std::is_base_of<std::true_type, std::is_constructible<int>>::value, "");
52static_assert(std::is_base_of<std::true_type, std::is_trivially_constructible<int>>::value, "");
53static_assert(std::is_base_of<std::true_type, std::is_nothrow_constructible<int>>::value, "");
54static_assert(std::is_base_of<std::true_type, std::is_default_constructible<int>>::value, "");
55static_assert(std::is_base_of<std::true_type, std::is_trivially_default_constructible<int>>::value, "");
56static_assert(std::is_base_of<std::true_type, std::is_nothrow_default_constructible<int>>::value, "");
57static_assert(std::is_base_of<std::true_type, std::is_copy_constructible<int>>::value, "");
58static_assert(std::is_base_of<std::true_type, std::is_trivially_copy_constructible<int>>::value, "");
59static_assert(std::is_base_of<std::true_type, std::is_nothrow_copy_constructible<int>>::value, "");
60static_assert(std::is_base_of<std::true_type, std::is_move_constructible<int>>::value, "");
61static_assert(std::is_base_of<std::true_type, std::is_trivially_move_constructible<int>>::value, "");
62static_assert(std::is_base_of<std::true_type, std::is_nothrow_move_constructible<int>>::value, "");
63static_assert(std::is_base_of<std::false_type, std::is_assignable<int, int>>::value, "");
64static_assert(std::is_base_of<std::false_type, std::is_trivially_assignable<int, int>>::value, "");
65static_assert(std::is_base_of<std::false_type, std::is_nothrow_assignable<int, int>>::value, "");
66static_assert(std::is_base_of<std::true_type, std::is_copy_assignable<int>>::value, "");
67static_assert(std::is_base_of<std::true_type, std::is_trivially_copy_assignable<int>>::value, "");
68static_assert(std::is_base_of<std::true_type, std::is_nothrow_copy_assignable<int>>::value, "");
69static_assert(std::is_base_of<std::true_type, std::is_move_assignable<int>>::value, "");
70static_assert(std::is_base_of<std::true_type, std::is_trivially_move_assignable<int>>::value, "");
71static_assert(std::is_base_of<std::true_type, std::is_nothrow_move_assignable<int>>::value, "");
72static_assert(std::is_base_of<std::true_type, std::is_destructible<int>>::value, "");
73static_assert(std::is_base_of<std::true_type, std::is_trivially_destructible<int>>::value, "");
74static_assert(std::is_base_of<std::true_type, std::is_nothrow_destructible<int>>::value, "");
75static_assert(std::is_base_of<std::false_type, std::has_virtual_destructor<int>>::value, "");
76static_assert(std::is_base_of<std::integral_constant<std::size_t, 1>, std::alignment_of<char>>::value, "");
77static_assert(std::is_base_of<std::integral_constant<std::size_t, 0>, std::rank<char>>::value, "");
78static_assert(std::is_base_of<std::integral_constant<std::size_t, 0>, std::extent<char>>::value, "");
79static_assert(std::is_base_of<std::true_type, std::is_same<int, int>>::value, "");
80static_assert(std::is_base_of<std::false_type, std::is_base_of<int, int>>::value, "");
81static_assert(std::is_base_of<std::true_type, std::is_convertible<int, int>>::value, "");
82#if TEST_STD_VER <= 17
83static_assert(std::is_base_of<std::true_type, std::is_literal_type<int>>::value, "");
84#endif
85#if TEST_STD_VER >= 14
86static_assert(std::is_base_of<std::false_type, std::is_null_pointer<int>>::value, "");
87static_assert(std::is_base_of<std::false_type, std::is_final<int>>::value, "");
88#endif
89#if TEST_STD_VER >= 17
90static_assert(std::is_base_of<std::true_type, std::has_unique_object_representations<int>>::value, "");
91static_assert(std::is_base_of<std::false_type, std::is_aggregate<int>>::value, "");
92static_assert(std::is_base_of<std::false_type, std::is_swappable_with<int, int>>::value, "");
93static_assert(std::is_base_of<std::true_type, std::is_swappable<int>>::value, "");
94static_assert(std::is_base_of<std::false_type, std::is_nothrow_swappable_with<int, int>>::value, "");
95static_assert(std::is_base_of<std::true_type, std::is_nothrow_swappable<int>>::value, "");
96static_assert(std::is_base_of<std::false_type, std::is_invocable<int>>::value, "");
97static_assert(std::is_base_of<std::false_type, std::is_invocable_r<int, int>>::value, "");
98static_assert(std::is_base_of<std::false_type, std::is_nothrow_invocable<int, int>>::value, "");
99static_assert(std::is_base_of<std::false_type, std::is_nothrow_invocable_r<int, int>>::value, "");
100#endif
101#if TEST_STD_VER >= 20
102static_assert(std::is_base_of<std::false_type, std::is_bounded_array<int>>::value, "");
103static_assert(std::is_base_of<std::false_type, std::is_unbounded_array<int>>::value, "");
104static_assert(std::is_base_of<std::true_type, std::is_nothrow_convertible<int, int>>::value, "");
105#endif
106#if TEST_STD_VER >= 23
107# if defined(__cpp_lib_is_implicit_lifetime) && __cpp_lib_is_implicit_lifetime >= 202302L
108static_assert(std::is_base_of<std::true_type, std::is_implicit_lifetime<int>>::value, "");
109# endif
110static_assert(std::is_base_of<std::false_type, std::is_scoped_enum<int>>::value, "");
111#endif
112#if TEST_STD_VER >= 26
113# if defined(__cpp_lib_is_virtual_base_of) && __cpp_lib_is_virtual_base_of >= 202406L
114static_assert(std::is_base_of<std::false_type, std::is_virtual_base_of<int, int>>::value, "");
115# endif
116#endif
117

source code of libcxx/test/std/utilities/meta/derived_from_integral_constant.compile.pass.cpp