Tested on Linux-x64. 2017-04-02 Ville Voutilainen <ville.voutilai...@gmail.com>
Implement std::is_aggregate. * include/std/type_traits (is_aggregate): 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..89a3738 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> + )> + { }; +#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..7208f8b --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/is_aggregate/value.cc @@ -0,0 +1,83 @@ +// { 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> + +void test01() +{ + using namespace __gnu_test; + using std::is_aggregate; + using __gnu_test::test_category; + + // 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), ""); + + // 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), ""); +}