// { dg-options "-std=gnu++17" } // { dg-do compile } // Copyright (C) 2014-2017 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . #include using namespace std; // These tests are rather simple, the front-end tests already test // variable templates, and the library tests for the underlying // traits are more elaborate. These are just simple sanity tests. static_assert(is_void_v && is_void::value, ""); static_assert(!is_void_v && !is_void::value, ""); static_assert(is_null_pointer_v && is_null_pointer::value, ""); static_assert(!is_null_pointer_v && !is_null_pointer::value, ""); static_assert(is_integral_v && is_integral::value, ""); static_assert(!is_integral_v && !is_integral::value, ""); static_assert(is_floating_point_v && is_floating_point::value, ""); static_assert(!is_floating_point_v && !is_floating_point::value, ""); static_assert(is_array_v && is_array::value, ""); static_assert(!is_array_v && !is_array::value, ""); static_assert(is_pointer_v && is_pointer::value, ""); static_assert(!is_pointer_v && !is_pointer::value, ""); static_assert(is_lvalue_reference_v && is_lvalue_reference::value, ""); static_assert(!is_lvalue_reference_v && !is_lvalue_reference::value, ""); static_assert(is_rvalue_reference_v && is_rvalue_reference::value, ""); static_assert(!is_rvalue_reference_v && !is_rvalue_reference::value, ""); struct EmptyFinal final {}; static_assert(is_member_object_pointer_v && is_member_object_pointer::value, ""); static_assert(!is_member_object_pointer_v && !is_member_object_pointer::value, ""); static_assert(is_member_function_pointer_v && is_member_function_pointer::value, ""); static_assert(!is_member_function_pointer_v && !is_member_function_pointer::value, ""); enum Enum {}; static_assert(is_enum_v && is_enum::value, ""); static_assert(!is_enum_v && !is_enum::value, ""); union Union; static_assert(is_union_v && is_union::value, ""); static_assert(!is_union_v && !is_union::value, ""); static_assert(is_class_v && is_class::value, ""); static_assert(!is_class_v && !is_class::value, ""); static_assert(is_function_v && is_function::value, ""); static_assert(!is_function_v && !is_function::value, ""); static_assert(is_reference_v && is_reference::value, ""); static_assert(!is_reference_v && !is_reference::value, ""); static_assert(is_arithmetic_v && is_arithmetic::value, ""); static_assert(!is_arithmetic_v && !is_arithmetic::value, ""); static_assert(is_fundamental_v && is_fundamental::value, ""); static_assert(!is_fundamental_v && !is_fundamental::value, ""); static_assert(is_object_v && is_object::value, ""); static_assert(!is_object_v && !is_object::value, ""); static_assert(is_scalar_v && is_scalar::value, ""); static_assert(!is_scalar_v && !is_scalar::value, ""); static_assert(is_compound_v && is_compound::value, ""); static_assert(!is_compound_v && !is_compound::value, ""); static_assert(is_member_pointer_v && is_member_pointer::value, ""); static_assert(!is_member_pointer_v && !is_member_pointer::value, ""); static_assert(is_const_v && is_const::value, ""); static_assert(!is_const_v && !is_const::value, ""); static_assert(is_volatile_v && is_volatile::value, ""); static_assert(!is_volatile_v && !is_volatile::value, ""); struct NType { NType(int); ~NType(); int i; private: NType(const NType&); NType& operator=(const NType&); int i2; }; static_assert(is_trivial_v && is_trivial::value, ""); static_assert(!is_trivial_v && !is_trivial::value, ""); static_assert(is_trivially_copyable_v && is_trivially_copyable::value, ""); static_assert(!is_trivially_copyable_v && !is_trivially_copyable::value, ""); static_assert(is_standard_layout_v && is_standard_layout::value, ""); static_assert(!is_standard_layout_v && !is_standard_layout::value, ""); static_assert(is_pod_v && is_pod::value, ""); static_assert(!is_pod_v && !is_pod::value, ""); static_assert(is_literal_type_v && is_literal_type::value, ""); static_assert(!is_literal_type_v && !is_literal_type::value, ""); static_assert(is_empty_v && is_empty::value, ""); static_assert(!is_empty_v && !is_empty::value, ""); struct Abstract {protected: virtual ~Abstract() = 0;}; struct Poly : Abstract {virtual ~Poly();}; static_assert(is_polymorphic_v && is_polymorphic::value, ""); static_assert(!is_polymorphic_v && !is_polymorphic::value, ""); static_assert(is_abstract_v && is_abstract::value, ""); static_assert(!is_abstract_v && !is_abstract::value, ""); static_assert(is_final_v && is_final::value, ""); static_assert(!is_final_v && !is_final::value, ""); static_assert(is_signed_v && is_signed::value, ""); static_assert(!is_signed_v && !is_signed::value, ""); static_assert(is_constructible_v && is_constructible::value, ""); static_assert(!is_constructible_v && !is_constructible::value, ""); static_assert(is_default_constructible_v && is_default_constructible::value, ""); static_assert(!is_default_constructible_v && !is_default_constructible::value, ""); static_assert(is_copy_constructible_v && is_copy_constructible::value, ""); static_assert(!is_copy_constructible_v && !is_copy_constructible::value, ""); static_assert(is_move_constructible_v && is_copy_constructible::value, ""); static_assert(!is_move_constructible_v && !is_copy_constructible::value, ""); static_assert(is_assignable_v && is_assignable::value, ""); static_assert(!is_assignable_v && !is_assignable::value, ""); static_assert(is_copy_assignable_v && is_copy_assignable::value, ""); static_assert(!is_copy_assignable_v && !is_copy_assignable::value, ""); static_assert(is_move_assignable_v && is_move_assignable::value, ""); static_assert(!is_move_assignable_v && !is_move_assignable::value, ""); static_assert(is_destructible_v && is_destructible::value, ""); static_assert(!is_destructible_v && !is_destructible::value, ""); static_assert(is_trivially_constructible_v && is_trivially_constructible::value, ""); static_assert(!is_trivially_constructible_v && !is_trivially_constructible::value, ""); static_assert(is_trivially_default_constructible_v && is_trivially_default_constructible::value, ""); static_assert(!is_trivially_default_constructible_v && !is_trivially_default_constructible::value, ""); static_assert(is_trivially_copy_constructible_v && is_trivially_copy_constructible::value, ""); static_assert(!is_trivially_copy_constructible_v && !is_trivially_copy_constructible::value, ""); static_assert(is_trivially_move_constructible_v && is_trivially_move_constructible::value, ""); static_assert(!is_trivially_move_constructible_v && !is_trivially_move_constructible::value, ""); static_assert(is_trivially_assignable_v && is_trivially_assignable::value, ""); static_assert(!is_trivially_assignable_v && !is_trivially_assignable::value, ""); static_assert(is_trivially_copy_assignable_v && is_trivially_copy_assignable::value, ""); static_assert(!is_trivially_copy_assignable_v && !is_trivially_copy_assignable::value, ""); static_assert(is_trivially_move_assignable_v && is_trivially_move_assignable::value, ""); static_assert(!is_trivially_move_assignable_v && !is_trivially_move_assignable::value, ""); static_assert(is_trivially_destructible_v && is_trivially_destructible::value, ""); static_assert(!is_trivially_destructible_v && !is_trivially_destructible::value, ""); static_assert(is_nothrow_constructible_v && is_nothrow_constructible::value, ""); static_assert(!is_nothrow_constructible_v && !is_nothrow_constructible::value, ""); static_assert(is_nothrow_default_constructible_v && is_nothrow_default_constructible::value, ""); static_assert(!is_nothrow_default_constructible_v && !is_nothrow_default_constructible::value, ""); static_assert(is_nothrow_copy_constructible_v && is_nothrow_copy_constructible::value, ""); static_assert(!is_nothrow_copy_constructible_v && !is_nothrow_copy_constructible::value, ""); static_assert(is_nothrow_move_constructible_v && is_nothrow_move_constructible::value, ""); static_assert(!is_nothrow_move_constructible_v && !is_nothrow_move_constructible::value, ""); static_assert(is_nothrow_assignable_v && is_nothrow_assignable::value, ""); static_assert(!is_nothrow_assignable_v && !is_nothrow_assignable::value, ""); static_assert(is_nothrow_copy_assignable_v && is_nothrow_copy_assignable::value, ""); static_assert(!is_nothrow_copy_assignable_v && !is_nothrow_copy_assignable::value, ""); static_assert(is_nothrow_move_assignable_v && is_nothrow_move_assignable::value, ""); static_assert(!is_nothrow_move_assignable_v && !is_nothrow_move_assignable::value, ""); static_assert(has_virtual_destructor_v && has_virtual_destructor::value, ""); static_assert(!has_virtual_destructor_v && !has_virtual_destructor::value, ""); static_assert(alignment_of_v == alignof(int) && alignment_of::value == alignof(int) , ""); static_assert(rank_v == rank::value, ""); static_assert(extent_v == 2 && extent::value == 2, ""); static_assert(is_same_v && is_same::value, ""); static_assert(!is_same_v && !is_same::value, ""); static_assert(is_base_of_v && is_base_of::value, ""); static_assert(!is_base_of_v && !is_base_of::value, ""); static_assert(is_convertible_v && is_convertible::value, ""); static_assert(!is_convertible_v && !is_convertible::value, ""); static_assert(negation_v, ""); static_assert(!negation_v, ""); static_assert(conjunction_v<>, ""); static_assert(!disjunction_v<>, ""); static_assert(conjunction_v, ""); static_assert(!conjunction_v, ""); static_assert(disjunction_v, ""); static_assert(!disjunction_v, ""); static_assert(conjunction_v, ""); static_assert(!conjunction_v, ""); static_assert(disjunction_v, ""); static_assert(!disjunction_v, ""); static_assert(conjunction_v, ""); static_assert(!conjunction_v, ""); static_assert(disjunction_v, ""); static_assert(!disjunction_v, "");