diff options
author | Ville Voutilainen <ville.voutilainen@gmail.com> | 2017-04-03 18:57:06 +0300 |
---|---|---|
committer | Ville Voutilainen <ville@gcc.gnu.org> | 2017-04-03 18:57:06 +0300 |
commit | e2ac6765db40313ff40b1421620a5f3cb0bffb92 (patch) | |
tree | 7941f90cdbf925871677ed76ad45965db02ea248 | |
parent | fff80893baad08414ee4332655f4ed5f557ae73a (diff) | |
download | gcc-e2ac6765db40313ff40b1421620a5f3cb0bffb92.zip gcc-e2ac6765db40313ff40b1421620a5f3cb0bffb92.tar.gz gcc-e2ac6765db40313ff40b1421620a5f3cb0bffb92.tar.bz2 |
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
5 files changed, 186 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 23ce6d3..62c8288 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2017-04-03 Ville Voutilainen <ville.voutilainen@gmail.com> + + 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 <ville.voutilainen@gmail.com> 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 6707caa..8ea2801 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -3062,6 +3062,26 @@ template <typename _From, typename _To> #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<typename _Tp> + struct is_aggregate + : bool_constant<__is_aggregate(remove_cv_t<_Tp>)> { }; + + /// is_aggregate_v + template<typename _Tp> + 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 0000000..4c189cd --- /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 +// <http://www.gnu.org/licenses/>. + +// NB: This file is for testing type_traits with NO OTHER INCLUDES. + +#include <type_traits> + +namespace std +{ + typedef short test_type; + template struct is_aggregate<test_type>; +} 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 0000000..4b0358c --- /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 +// <http://www.gnu.org/licenses/>. + +// NB: This file is for testing type_traits with NO OTHER INCLUDES. + +#include <type_traits> + +void test01() +{ + // Check for required typedefs + typedef std::is_aggregate<int> test_type; + static_assert( std::is_same<test_type::value_type, bool>::value ); + typedef std::integral_constant<bool, test_type{}()> bool_type; + static_assert( std::is_same<test_type::type, bool_type>::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 0000000..6168d9c --- /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 +// <http://www.gnu.org/licenses/>. + +#include <type_traits> +#include <testsuite_tr1.h> +#include <tuple> + +template <class... T> void pos() +{ + static_assert((std::is_aggregate_v<T> &&...)); +} + +template <class... T> void neg() +{ + static_assert((!std::is_aggregate_v<T> &&...)); +} + +void test01() +{ + using namespace __gnu_test; + using __gnu_test::test_category; + using std::is_aggregate; + + // Positive tests. + static_assert(test_category<is_aggregate, + ClassType>(true), ""); + static_assert(test_category<is_aggregate, + UnionType>(true), ""); + static_assert(test_category<is_aggregate, + SLType>(true), ""); + static_assert(test_category<is_aggregate, + NoexceptMoveAssignClass>(true), ""); + static_assert(test_category<is_aggregate, + unsigned[3]>(true), ""); + static_assert(test_category<is_aggregate, + unsigned[3][2]>(true), ""); + static_assert(test_category<is_aggregate, + unsigned[]>(true), ""); + static_assert(test_category<is_aggregate, + unsigned[][2]>(true), ""); + static_assert(test_category<is_aggregate, + EnumType[3]>(true), ""); + static_assert(test_category<is_aggregate, + EnumType[3][2]>(true), ""); + static_assert(test_category<is_aggregate, + EnumType[]>(true), ""); + static_assert(test_category<is_aggregate, + EnumType[][2]>(true), ""); + pos<ClassType, UnionType, SLType, NoexceptMoveAssignClass, + unsigned[3], unsigned[3][2], unsigned[], unsigned[][3]>(); + + // Negative tests. + static_assert(test_category<is_aggregate, + AbstractClass>(false), ""); + static_assert(test_category<is_aggregate, + PolymorphicClass>(false), ""); + static_assert(test_category<is_aggregate, + ExplicitClass>(false), ""); + static_assert(test_category<is_aggregate, + char>(false), ""); + static_assert(test_category<is_aggregate, + unsigned char>(false), ""); + static_assert(test_category<is_aggregate, + signed char>(false), ""); + static_assert(test_category<is_aggregate, + unsigned>(false), ""); + static_assert(test_category<is_aggregate, + bool>(false), ""); + static_assert(test_category<is_aggregate, + float>(false), ""); + static_assert(test_category<is_aggregate, + double>(false), ""); + static_assert(test_category<is_aggregate, + EnumType>(false), ""); + static_assert(test_category<is_aggregate, + void>(false), ""); + neg<AbstractClass, PolymorphicClass, ExplicitClass, char, unsigned, + bool, float, double, void>(); +} |