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>
|
||||
|
||||
* doc/xml/manual/status_cxx2011.xml: Update status.
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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