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