diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2016-10-07 19:02:43 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2016-10-07 19:02:43 +0100 |
commit | 873c7d5ade8c018b0b2ab50c0ba232473bbf86ed (patch) | |
tree | e71c6c46a79ba8f847e8df15286bd5a09d096a79 | |
parent | c09c4992ac138656415fc108edcab8d643fc89bb (diff) | |
download | gcc-873c7d5ade8c018b0b2ab50c0ba232473bbf86ed.zip gcc-873c7d5ade8c018b0b2ab50c0ba232473bbf86ed.tar.gz gcc-873c7d5ade8c018b0b2ab50c0ba232473bbf86ed.tar.bz2 |
Implement std::has_unique_object_representations
* doc/xml/manual/status_cxx2017.xml: Update status.
* include/std/type_traits (has_unique_object_representations): Define.
* testsuite/20_util/has_unique_object_representations/value.cc: New.
* testsuite/20_util/has_unique_object_representations/requirements/
explicit_instantiation.cc: New.
* testsuite/20_util/has_unique_object_representations/requirements/
typedefs.cc: New.
From-SVN: r240868
6 files changed, 192 insertions, 2 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index d9fa88a..68f1b51 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2016-10-07 Jonathan Wakely <jwakely@redhat.com> + + * doc/xml/manual/status_cxx2017.xml: Update status. + * include/std/type_traits (has_unique_object_representations): Define. + * testsuite/20_util/has_unique_object_representations/value.cc: New. + * testsuite/20_util/has_unique_object_representations/requirements/ + explicit_instantiation.cc: New. + * testsuite/20_util/has_unique_object_representations/requirements/ + typedefs.cc: New. + 2016-10-06 Jonathan Wakely <jwakely@redhat.com> * doc/xml/manual/status_cxx2011.xml: Update status. diff --git a/libstdc++-v3/doc/xml/manual/status_cxx2017.xml b/libstdc++-v3/doc/xml/manual/status_cxx2017.xml index 9f47b349..f1d709e 100644 --- a/libstdc++-v3/doc/xml/manual/status_cxx2017.xml +++ b/libstdc++-v3/doc/xml/manual/status_cxx2017.xml @@ -441,14 +441,13 @@ Feature-testing recommendations for C++</link>. </row> <row> - <?dbhtml bgcolor="#C8B0B0" ?> <entry> has_unique_object_representations </entry> <entry> <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0258r2.html"> P0258R2 </link> </entry> - <entry align="center"> No </entry> + <entry align="center"> 7 </entry> <entry><code> __cpp_lib_has_unique_object_representations >= 201606 </code></entry> </row> diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index cd0ba99..d402b5b 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -3040,6 +3040,16 @@ template <typename _Base, typename _Derived> constexpr bool is_base_of_v = is_base_of<_Base, _Derived>::value; template <typename _From, typename _To> constexpr bool is_convertible_v = is_convertible<_From, _To>::value; + +# define __cpp_lib_has_unique_object_representations 201606 + /// has_unique_object_representations + template<typename _Tp> + struct has_unique_object_representations + : bool_constant<__has_unique_object_representations( + remove_cv_t<remove_all_extents_t<_Tp>> + )> + { }; + #endif // C++17 _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/testsuite/20_util/has_unique_object_representations/requirements/explicit_instantiation.cc b/libstdc++-v3/testsuite/20_util/has_unique_object_representations/requirements/explicit_instantiation.cc new file mode 100644 index 0000000..29be714 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/has_unique_object_representations/requirements/explicit_instantiation.cc @@ -0,0 +1,29 @@ +// { dg-options "-std=gnu++1z" } +// { dg-do compile { target c++1z } } + +// Copyright (C) 2016 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 has_unique_object_representations<test_type>; +} diff --git a/libstdc++-v3/testsuite/20_util/has_unique_object_representations/requirements/typedefs.cc b/libstdc++-v3/testsuite/20_util/has_unique_object_representations/requirements/typedefs.cc new file mode 100644 index 0000000..e24a972 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/has_unique_object_representations/requirements/typedefs.cc @@ -0,0 +1,32 @@ +// { dg-options "-std=gnu++1z" } +// { dg-do compile { target c++1z } } + +// Copyright (C) 2016 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::has_unique_object_representations<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/has_unique_object_representations/value.cc b/libstdc++-v3/testsuite/20_util/has_unique_object_representations/value.cc new file mode 100644 index 0000000..5a77ee5 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/has_unique_object_representations/value.cc @@ -0,0 +1,110 @@ +// { dg-options "-std=gnu++1z" } +// { dg-do compile { target c++1z } } + +// Copyright (C) 2016 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 std::has_unique_object_representations; + using __gnu_test::test_category; + + // Positive tests. + static_assert(test_category<has_unique_object_representations, + char>(true), ""); + static_assert(test_category<has_unique_object_representations, + unsigned char>(true), ""); + static_assert(test_category<has_unique_object_representations, + signed char>(true), ""); + static_assert(test_category<has_unique_object_representations, + unsigned>(true), ""); + static_assert(test_category<has_unique_object_representations, + bool>(true), ""); + + enum E : unsigned { }; + static_assert(test_category<has_unique_object_representations, + E>(true), ""); + + static_assert(test_category<has_unique_object_representations, + unsigned[3]>(true), ""); + static_assert(test_category<has_unique_object_representations, + unsigned[3][2]>(true), ""); + static_assert(test_category<has_unique_object_representations, + unsigned[]>(true), ""); + static_assert(test_category<has_unique_object_representations, + unsigned[][2]>(true), ""); + static_assert(test_category<has_unique_object_representations, + E[3]>(true), ""); + static_assert(test_category<has_unique_object_representations, + E[3][2]>(true), ""); + static_assert(test_category<has_unique_object_representations, + E[]>(true), ""); + static_assert(test_category<has_unique_object_representations, + E[][2]>(true), ""); + + struct Padded { + char c1; + alignas(4) char c2; + }; + + struct Bitfield { + int i : 3; + }; + + struct Aligned { + alignas(4) char c; + }; + + // Negative tests. + static_assert(test_category<has_unique_object_representations, + void>(false), ""); + static_assert(test_category<has_unique_object_representations, + float>(false), ""); // implementation-defined + static_assert(test_category<has_unique_object_representations, + Padded>(false), ""); + static_assert(test_category<has_unique_object_representations, + Padded[2]>(false), ""); + static_assert(test_category<has_unique_object_representations, + Padded[2][1]>(false), ""); + static_assert(test_category<has_unique_object_representations, + Padded[]>(false), ""); + static_assert(test_category<has_unique_object_representations, + Padded[][1]>(false), ""); + static_assert(test_category<has_unique_object_representations, + Bitfield>(false), ""); + static_assert(test_category<has_unique_object_representations, + Bitfield[2]>(false), ""); + static_assert(test_category<has_unique_object_representations, + Bitfield[2][1]>(false), ""); + static_assert(test_category<has_unique_object_representations, + Bitfield[]>(false), ""); + static_assert(test_category<has_unique_object_representations, + Bitfield[][1]>(false), ""); + static_assert(test_category<has_unique_object_representations, + Aligned>(false), ""); + static_assert(test_category<has_unique_object_representations, + Aligned[2]>(false), ""); + static_assert(test_category<has_unique_object_representations, + Aligned[2][1]>(false), ""); + static_assert(test_category<has_unique_object_representations, + Aligned[]>(false), ""); + static_assert(test_category<has_unique_object_representations, + Aligned[][1]>(false), ""); +} |