On 2 April 2017 at 14:08, Jakub Jelinek <ja...@redhat.com> wrote: > On Sun, Apr 02, 2017 at 12:24:16PM +0300, Ville Voutilainen wrote: >> On 2 April 2017 at 08:35, Jakub Jelinek <ja...@redhat.com> wrote: >> >> + remove_cv_t<_Tp> >> >> + )> >> > >> > Any reason for the wrapping? >> >> No, it's just a result of a nocturnal copy-paste-job of the existing >> code for has_unique_object_representations. >> >> > Also, shouldn't there be also: >> > >> > /// is_aggregate_v >> > template<typename _Tp> >> > _GLIBCXX17_INLINE constexpr bool is_aggregate_v = >> > is_aggregate<_Tp>::value; >> > >> > somewhere with appropriate guards (or within the same ones)? >> >> Yes, well spotted. I will add that.
Thus: 2017-04-02 Ville Voutilainen <ville.voutilai...@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.
diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 6707caa..a5e7048 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -3062,6 +3062,25 @@ 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>(); +}