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