From e2ac6765db40313ff40b1421620a5f3cb0bffb92 Mon Sep 17 00:00:00 2001 From: Ville Voutilainen Date: Mon, 3 Apr 2017 18:57:06 +0300 Subject: [PATCH] Implement std::is_aggregate. * include/std/type_traits (is_aggregate, is_aggregate_v): New. * testsuite/20_util/is_aggregate/requirements/explicit_instantiation.cc: New. * testsuite/20_util/is_aggregate/requirements/typedefs.cc: Likewise. * testsuite/20_util/is_aggregate/value.cc: Likewise. From-SVN: r246651 --- libstdc++-v3/ChangeLog | 9 ++ libstdc++-v3/include/std/type_traits | 20 ++++ .../requirements/explicit_instantiation.cc | 29 ++++++ .../is_aggregate/requirements/typedefs.cc | 32 +++++++ .../testsuite/20_util/is_aggregate/value.cc | 96 +++++++++++++++++++ 5 files changed, 186 insertions(+) create mode 100644 libstdc++-v3/testsuite/20_util/is_aggregate/requirements/explicit_instantiation.cc create mode 100644 libstdc++-v3/testsuite/20_util/is_aggregate/requirements/typedefs.cc create mode 100644 libstdc++-v3/testsuite/20_util/is_aggregate/value.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 23ce6d3885b..62c8288644a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2017-04-03 Ville Voutilainen + + Implement std::is_aggregate. + * include/std/type_traits (is_aggregate, is_aggregate_v): New. + * testsuite/20_util/is_aggregate/requirements/explicit_instantiation.cc: + New. + * testsuite/20_util/is_aggregate/requirements/typedefs.cc: Likewise. + * testsuite/20_util/is_aggregate/value.cc: Likewise. + 2017-03-29 Ville Voutilainen Adjust optional's pretty printer for LWG 2900. diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 6707caaefc5..8ea280125e6 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -3062,6 +3062,26 @@ template #endif #undef _GLIBCXX_NO_BUILTIN_HAS_UNIQ_OBJ_REP +#ifdef __has_builtin +# if !__has_builtin(__is_aggregate) +// Try not to break non-GNU compilers that don't support the built-in: +# define _GLIBCXX_NO_BUILTIN_IS_AGGREGATE 1 +# endif +#endif + +#ifndef _GLIBCXX_NO_BUILTIN_IS_AGGREGATE +#define __cpp_lib_is_aggregate 201703 + /// is_aggregate + template + struct is_aggregate + : bool_constant<__is_aggregate(remove_cv_t<_Tp>)> { }; + + /// is_aggregate_v + template + inline constexpr bool is_aggregate_v = is_aggregate<_Tp>::value; +#endif +#undef _GLIBCXX_NO_BUILTIN_IS_AGGREGATE + #endif // C++17 _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/testsuite/20_util/is_aggregate/requirements/explicit_instantiation.cc b/libstdc++-v3/testsuite/20_util/is_aggregate/requirements/explicit_instantiation.cc new file mode 100644 index 00000000000..4c189cdc0c3 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_aggregate/requirements/explicit_instantiation.cc @@ -0,0 +1,29 @@ +// { dg-options "-std=gnu++1z" } +// { dg-do compile { target c++1z } } + +// Copyright (C) 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 +// . + +// NB: This file is for testing type_traits with NO OTHER INCLUDES. + +#include + +namespace std +{ + typedef short test_type; + template struct is_aggregate; +} diff --git a/libstdc++-v3/testsuite/20_util/is_aggregate/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/is_aggregate/requirements/typedefs.cc new file mode 100644 index 00000000000..4b0358ccc90 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_aggregate/requirements/typedefs.cc @@ -0,0 +1,32 @@ +// { dg-options "-std=gnu++1z" } +// { dg-do compile { target c++1z } } + +// Copyright (C) 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 +// . + +// NB: This file is for testing type_traits with NO OTHER INCLUDES. + +#include + +void test01() +{ + // Check for required typedefs + typedef std::is_aggregate test_type; + static_assert( std::is_same::value ); + typedef std::integral_constant bool_type; + static_assert( std::is_same::value ); +} diff --git a/libstdc++-v3/testsuite/20_util/is_aggregate/value.cc b/libstdc++-v3/testsuite/20_util/is_aggregate/value.cc new file mode 100644 index 00000000000..6168d9c39c7 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_aggregate/value.cc @@ -0,0 +1,96 @@ +// { dg-options "-std=gnu++1z" } +// { dg-do compile { target c++1z } } + +// Copyright (C) 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 +#include +#include + +template void pos() +{ + static_assert((std::is_aggregate_v &&...)); +} + +template void neg() +{ + static_assert((!std::is_aggregate_v &&...)); +} + +void test01() +{ + using namespace __gnu_test; + using __gnu_test::test_category; + using std::is_aggregate; + + // Positive tests. + static_assert(test_category(true), ""); + static_assert(test_category(true), ""); + static_assert(test_category(true), ""); + static_assert(test_category(true), ""); + static_assert(test_category(true), ""); + static_assert(test_category(true), ""); + static_assert(test_category(true), ""); + static_assert(test_category(true), ""); + static_assert(test_category(true), ""); + static_assert(test_category(true), ""); + static_assert(test_category(true), ""); + static_assert(test_category(true), ""); + pos(); + + // Negative tests. + static_assert(test_category(false), ""); + static_assert(test_category(false), ""); + static_assert(test_category(false), ""); + static_assert(test_category(false), ""); + static_assert(test_category(false), ""); + static_assert(test_category(false), ""); + static_assert(test_category(false), ""); + static_assert(test_category(false), ""); + static_assert(test_category(false), ""); + static_assert(test_category(false), ""); + static_assert(test_category(false), ""); + static_assert(test_category(false), ""); + neg(); +} -- 2.30.2