117 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++0310 11// Check that type traits derive from integral_constant12 13// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS14 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 <= 1783static_assert(std::is_base_of<std::true_type, std::is_literal_type<int>>::value, "");84#endif85#if TEST_STD_VER >= 1486static_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#endif89#if TEST_STD_VER >= 1790static_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#endif101#if TEST_STD_VER >= 20102static_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#endif106#if TEST_STD_VER >= 23107# if defined(__cpp_lib_is_implicit_lifetime) && __cpp_lib_is_implicit_lifetime >= 202302L108static_assert(std::is_base_of<std::true_type, std::is_implicit_lifetime<int>>::value, "");109# endif110static_assert(std::is_base_of<std::false_type, std::is_scoped_enum<int>>::value, "");111#endif112#if TEST_STD_VER >= 26113# if defined(__cpp_lib_is_virtual_base_of) && __cpp_lib_is_virtual_base_of >= 202406L114static_assert(std::is_base_of<std::false_type, std::is_virtual_base_of<int, int>>::value, "");115# endif116#endif117