// { 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