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
This commit is contained in:
parent
c09c4992ac
commit
873c7d5ade
6 changed files with 192 additions and 2 deletions
|
@ -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>
|
2016-10-06 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
* doc/xml/manual/status_cxx2011.xml: Update status.
|
* doc/xml/manual/status_cxx2011.xml: Update status.
|
||||||
|
|
|
@ -441,14 +441,13 @@ Feature-testing recommendations for C++</link>.
|
||||||
</row>
|
</row>
|
||||||
|
|
||||||
<row>
|
<row>
|
||||||
<?dbhtml bgcolor="#C8B0B0" ?>
|
|
||||||
<entry> has_unique_object_representations </entry>
|
<entry> has_unique_object_representations </entry>
|
||||||
<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">
|
<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
|
P0258R2
|
||||||
</link>
|
</link>
|
||||||
</entry>
|
</entry>
|
||||||
<entry align="center"> No </entry>
|
<entry align="center"> 7 </entry>
|
||||||
<entry><code> __cpp_lib_has_unique_object_representations >= 201606 </code></entry>
|
<entry><code> __cpp_lib_has_unique_object_representations >= 201606 </code></entry>
|
||||||
</row>
|
</row>
|
||||||
|
|
||||||
|
|
|
@ -3040,6 +3040,16 @@ template <typename _Base, typename _Derived>
|
||||||
constexpr bool is_base_of_v = is_base_of<_Base, _Derived>::value;
|
constexpr bool is_base_of_v = is_base_of<_Base, _Derived>::value;
|
||||||
template <typename _From, typename _To>
|
template <typename _From, typename _To>
|
||||||
constexpr bool is_convertible_v = is_convertible<_From, _To>::value;
|
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
|
#endif // C++17
|
||||||
|
|
||||||
_GLIBCXX_END_NAMESPACE_VERSION
|
_GLIBCXX_END_NAMESPACE_VERSION
|
||||||
|
|
|
@ -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>;
|
||||||
|
}
|
|
@ -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 );
|
||||||
|
}
|
|
@ -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), "");
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue