* [v3 PATCH] Implement std::is_aggregate. @ 2017-04-01 22:19 Ville Voutilainen 2017-04-02 5:35 ` Jakub Jelinek 0 siblings, 1 reply; 6+ messages in thread From: Ville Voutilainen @ 2017-04-01 22:19 UTC (permalink / raw) To: libstdc++, gcc-patches [-- Attachment #1: Type: text/plain, Size: 384 bytes --] Tested on Linux-x64. 2017-04-02 Ville Voutilainen <ville.voutilainen@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. [-- Attachment #2: is_aggregate.diff --] [-- Type: text/plain, Size: 6924 bytes --] 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), ""); +} ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [v3 PATCH] Implement std::is_aggregate. 2017-04-01 22:19 [v3 PATCH] Implement std::is_aggregate Ville Voutilainen @ 2017-04-02 5:35 ` Jakub Jelinek 2017-04-02 9:24 ` Ville Voutilainen 0 siblings, 1 reply; 6+ messages in thread From: Jakub Jelinek @ 2017-04-02 5:35 UTC (permalink / raw) To: Ville Voutilainen; +Cc: libstdc++, gcc-patches On Sun, Apr 02, 2017 at 01:18:58AM +0300, Ville Voutilainen wrote: > Tested on Linux-x64. > > 2017-04-02 Ville Voutilainen <ville.voutilainen@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> > + )> Any reason for the wrapping? > + : bool_constant<__is_aggregate(remove_cv_t<_Tp>)> Would fit on one line. I admit I know next to nothing about libstdc++ code formatting. > + { }; 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)? > +#endif > +#undef _GLIBCXX_NO_BUILTIN_IS_AGGREGATE > + > #endif // C++17 > > _GLIBCXX_END_NAMESPACE_VERSION I'm surprised tests for the is_*_v variable templates are only in experimental/type_traits/value.cc when they are now apparently part of C++17. Jakub ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [v3 PATCH] Implement std::is_aggregate. 2017-04-02 5:35 ` Jakub Jelinek @ 2017-04-02 9:24 ` Ville Voutilainen 2017-04-02 11:08 ` Jakub Jelinek 0 siblings, 1 reply; 6+ messages in thread From: Ville Voutilainen @ 2017-04-02 9:24 UTC (permalink / raw) To: Jakub Jelinek; +Cc: libstdc++, gcc-patches On 2 April 2017 at 08:35, Jakub Jelinek <jakub@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. > I'm surprised tests for the is_*_v variable templates are only in > experimental/type_traits/value.cc when they are now apparently > part of C++17. Perhaps 20_util/variable_templates_for_traits.cc ? ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [v3 PATCH] Implement std::is_aggregate. 2017-04-02 9:24 ` Ville Voutilainen @ 2017-04-02 11:08 ` Jakub Jelinek 2017-04-02 12:08 ` Ville Voutilainen 0 siblings, 1 reply; 6+ messages in thread From: Jakub Jelinek @ 2017-04-02 11:08 UTC (permalink / raw) To: Ville Voutilainen; +Cc: libstdc++, gcc-patches On Sun, Apr 02, 2017 at 12:24:16PM +0300, Ville Voutilainen wrote: > On 2 April 2017 at 08:35, Jakub Jelinek <jakub@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. > > > I'm surprised tests for the is_*_v variable templates are only in > > experimental/type_traits/value.cc when they are now apparently > > part of C++17. > > Perhaps 20_util/variable_templates_for_traits.cc ? Whatever you/Jonathan and/or Paolo agree on, libstdc++ isn't my area of expertise. Jakub ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [v3 PATCH] Implement std::is_aggregate. 2017-04-02 11:08 ` Jakub Jelinek @ 2017-04-02 12:08 ` Ville Voutilainen 2017-04-03 15:32 ` Jonathan Wakely 0 siblings, 1 reply; 6+ messages in thread From: Ville Voutilainen @ 2017-04-02 12:08 UTC (permalink / raw) To: Jakub Jelinek; +Cc: libstdc++, gcc-patches [-- Attachment #1: Type: text/plain, Size: 1106 bytes --] On 2 April 2017 at 14:08, Jakub Jelinek <jakub@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 <jakub@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.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. [-- Attachment #2: is_aggregate_2.diff --] [-- Type: text/plain, Size: 7456 bytes --] 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>(); +} ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [v3 PATCH] Implement std::is_aggregate. 2017-04-02 12:08 ` Ville Voutilainen @ 2017-04-03 15:32 ` Jonathan Wakely 0 siblings, 0 replies; 6+ messages in thread From: Jonathan Wakely @ 2017-04-03 15:32 UTC (permalink / raw) To: Ville Voutilainen; +Cc: Jakub Jelinek, libstdc++, gcc-patches On 02/04/17 15:08 +0300, Ville Voutilainen wrote: > 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>)> { }; Blank line here please. >+ /// 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 OK for trunk, thanks. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-04-03 15:32 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-04-01 22:19 [v3 PATCH] Implement std::is_aggregate Ville Voutilainen 2017-04-02 5:35 ` Jakub Jelinek 2017-04-02 9:24 ` Ville Voutilainen 2017-04-02 11:08 ` Jakub Jelinek 2017-04-02 12:08 ` Ville Voutilainen 2017-04-03 15:32 ` Jonathan Wakely
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).