Another new C++17 feature, using Jakub's new builtin.
* 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. Tested x86_64-linux, committed to trunk.
commit 79664ebd750fbe597021ce039ac86f503d477e76 Author: Jonathan Wakely <jwak...@redhat.com> Date: Fri Oct 7 12:59:16 2016 +0100 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. 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), ""); +}