re PR libstdc++/77802 (Boost Fiber doesn't compile)
authorVille Voutilainen <ville.voutilainen@gmail.com>
Mon, 3 Oct 2016 11:06:53 +0000 (14:06 +0300)
committerVille Voutilainen <ville@gcc.gnu.org>
Mon, 3 Oct 2016 11:06:53 +0000 (14:06 +0300)
    PR libstdc++/77802
    * testsuite/20_util/tuple/77802.cc: New.

    Revert:
    2016-09-21  Ville Voutilainen  <ville.voutilainen@gmail.com>
    Implement LWG 2729 for tuple.
    * include/std/tuple (_Tuple_impl(_Tuple_impl&&)):
    Suppress conditionally.
    (_Tuple_impl(_Tuple_impl<_Idx, _UHead, _UTails...>&&)): Likewise.
    (__is_tuple_impl_trait_impl, __is_tuple_impl_trait): New.
    (_Tuple_impl(const _Head&)): Constrain.
    (_Tuple_impl(_UHead&&)): Likewise.
    (_Tuple_impl(_Tuple_impl&&)): Suppress conditionally.
    (_Tuple_impl(const _Tuple_impl<_Idx, _UHead>&)): Constrain.
    (_Tuple_impl(_Tuple_impl<_Idx, _UHead>&&)): Likewise.
    (operator=(const tuple&)): Enable conditionally.
    (operator=(tuple&&)): Suppress conditionally.
    (operator=(const tuple<_UElements...>&)): Constrain.
    (operator=(tuple<_UElements...>&&)): Likewise.
    (operator=(const tuple&)): Enable conditionally (2-param tuple).
    (operator=(tuple&&)): Suppress conditionally (2-param tuple).
    (operator=(const tuple<_U1, _U2>&)): Constrain.
    (operator=(tuple<_U1, _U2>&&)): Likewise.
    (operator=(const pair<_U1, _U2>&)): Likewise.
    (operator=(pair<_U1, _U2>&&)): Likewise.
    * testsuite/20_util/tuple/element_access/get_neg.cc: Adjust.
    * testsuite/20_util/tuple/tuple_traits.cc: New.

From-SVN: r240709

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/tuple
libstdc++-v3/testsuite/20_util/tuple/77802.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/tuple/element_access/get_neg.cc
libstdc++-v3/testsuite/20_util/tuple/tuple_traits.cc [deleted file]

index be41539547da0bfba94f22600c77a8b97c4501ad..31dfa65bf56bbee295872a70dca17dc0fea17fbf 100644 (file)
@@ -1,3 +1,33 @@
+2016-10-03  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       PR libstdc++/77802
+       * testsuite/20_util/tuple/77802.cc: New.
+
+       Revert:
+       2016-09-21  Ville Voutilainen  <ville.voutilainen@gmail.com>
+       Implement LWG 2729 for tuple.
+       * include/std/tuple (_Tuple_impl(_Tuple_impl&&)):
+       Suppress conditionally.
+       (_Tuple_impl(_Tuple_impl<_Idx, _UHead, _UTails...>&&)): Likewise.
+       (__is_tuple_impl_trait_impl, __is_tuple_impl_trait): New.
+       (_Tuple_impl(const _Head&)): Constrain.
+       (_Tuple_impl(_UHead&&)): Likewise.
+       (_Tuple_impl(_Tuple_impl&&)): Suppress conditionally.
+       (_Tuple_impl(const _Tuple_impl<_Idx, _UHead>&)): Constrain.
+       (_Tuple_impl(_Tuple_impl<_Idx, _UHead>&&)): Likewise.
+       (operator=(const tuple&)): Enable conditionally.
+       (operator=(tuple&&)): Suppress conditionally.
+       (operator=(const tuple<_UElements...>&)): Constrain.
+       (operator=(tuple<_UElements...>&&)): Likewise.
+       (operator=(const tuple&)): Enable conditionally (2-param tuple).
+       (operator=(tuple&&)): Suppress conditionally (2-param tuple).
+       (operator=(const tuple<_U1, _U2>&)): Constrain.
+       (operator=(tuple<_U1, _U2>&&)): Likewise.
+       (operator=(const pair<_U1, _U2>&)): Likewise.
+       (operator=(pair<_U1, _U2>&&)): Likewise.
+       * testsuite/20_util/tuple/element_access/get_neg.cc: Adjust.
+       * testsuite/20_util/tuple/tuple_traits.cc: New.
+
 2016-09-30  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/77795
index 32b932f79fd4144931a21acdb3d3c520b98bd182..c06a040a960995d18da4531a46757460c7ffc55f 100644 (file)
@@ -220,11 +220,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       constexpr _Tuple_impl(const _Tuple_impl&) = default;
 
       constexpr
-      _Tuple_impl(typename conditional<
-                 __and_<is_move_constructible<_Head>,
-                        is_move_constructible<_Inherited>>::value,
-                 _Tuple_impl&&, __nonesuch&&>::type __in)
-       noexcept(__and_<is_nothrow_move_constructible<_Head>,
+      _Tuple_impl(_Tuple_impl&& __in)
+      noexcept(__and_<is_nothrow_move_constructible<_Head>,
                      is_nothrow_move_constructible<_Inherited>>::value)
       : _Inherited(std::move(_M_tail(__in))),
        _Base(std::forward<_Head>(_M_head(__in))) { }
@@ -235,11 +232,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          _Base(_Tuple_impl<_Idx, _UElements...>::_M_head(__in)) { }
 
       template<typename _UHead, typename... _UTails>
-        constexpr _Tuple_impl(typename conditional<
-                             __and_<is_move_constructible<_Head>,
-                             is_move_constructible<_Inherited>>::value,
-                             _Tuple_impl<_Idx, _UHead, _UTails...>&&,
-                             __nonesuch&&>::type __in)
+        constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in)
        : _Inherited(std::move
                     (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))),
          _Base(std::forward<_UHead>
@@ -345,18 +338,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       }
     };
 
-  template<typename...>
-    struct __is_tuple_impl_trait_impl : false_type
-    { };
-
-  template<std::size_t _Idx, typename... _Tp>
-    struct __is_tuple_impl_trait_impl<_Tuple_impl<_Idx, _Tp...>> : true_type
-    { };
-
-  template<typename _Tp>
-    struct __is_tuple_impl_trait : public __is_tuple_impl_trait_impl<_Tp>
-    { };
-
   // Basis case of inheritance recursion.
   template<std::size_t _Idx, typename _Head>
     struct _Tuple_impl<_Idx, _Head>
@@ -375,20 +356,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       constexpr _Tuple_impl()
       : _Base() { }
 
-      template<typename _Dummy=void,
-              typename enable_if<is_constructible<_Base, const _Head&>::value,
-                                 bool>::type=true>
       explicit
       constexpr _Tuple_impl(const _Head& __head)
       : _Base(__head) { }
 
-      template<typename _UHead,
-              typename enable_if<__and_<is_constructible<_Base, _UHead&&>,
-                                        __not_<__is_tuple_impl_trait<
-                                          typename
-                                            remove_reference<_UHead>::type>>
-                                        >::value,
-                                 bool>::type = true>
+      template<typename _UHead>
         explicit
         constexpr _Tuple_impl(_UHead&& __head)
        : _Base(std::forward<_UHead>(__head)) { }
@@ -396,21 +368,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       constexpr _Tuple_impl(const _Tuple_impl&) = default;
 
       constexpr
-      _Tuple_impl(typename conditional<
-                 is_move_constructible<_Head>::value,
-                 _Tuple_impl&&, __nonesuch&&>::type __in)
+      _Tuple_impl(_Tuple_impl&& __in)
       noexcept(is_nothrow_move_constructible<_Head>::value)
       : _Base(std::forward<_Head>(_M_head(__in))) { }
 
-      template<typename _UHead,
-              typename enable_if<!is_same<_Head, _UHead>::value,
-                                 bool>::type = true>
+      template<typename _UHead>
         constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UHead>& __in)
        : _Base(_Tuple_impl<_Idx, _UHead>::_M_head(__in)) { }
 
-      template<typename _UHead,
-              typename enable_if<!is_same<_Head, _UHead>::value,
-                                 bool>::type = true>
+      template<typename _UHead>
         constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead>&& __in)
        : _Base(std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in)))
        { }
@@ -866,18 +832,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        { }
 
       tuple&
-      operator=(typename
-               conditional<__and_<is_copy_assignable<_Elements>...>::value,
-               const tuple&, const __nonesuch&>::type __in)
+      operator=(const tuple& __in)
       {
        static_cast<_Inherited&>(*this) = __in;
        return *this;
       }
 
       tuple&
-      operator=(typename
-               conditional<__and_<is_move_assignable<_Elements>...>::value,
-               tuple&&, __nonesuch&&>::type __in)
+      operator=(tuple&& __in)
       noexcept(is_nothrow_move_assignable<_Inherited>::value)
       {
        static_cast<_Inherited&>(*this) = std::move(__in);
@@ -886,10 +848,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       template<typename... _UElements, typename = typename
               enable_if<sizeof...(_UElements)
-                        == sizeof...(_Elements)
-              &&
-              __and_<is_assignable<_Elements&,
-                                   const _UElements&>...>::value>::type>
+                        == sizeof...(_Elements)>::type>
         tuple&
         operator=(const tuple<_UElements...>& __in)
         {
@@ -899,10 +858,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       template<typename... _UElements, typename = typename
               enable_if<sizeof...(_UElements)
-                        == sizeof...(_Elements)
-              &&
-              __and_<is_assignable<_Elements&,
-                                   _UElements&&>...>::value>::type>
+                        == sizeof...(_Elements)>::type>
         tuple&
         operator=(tuple<_UElements...>&& __in)
         {
@@ -1233,20 +1189,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                     std::forward<_U2>(__in.second)) { }
 
       tuple&
-      operator=(typename
-               conditional<__and_<is_copy_assignable<_T1>,
-                                  is_copy_assignable<_T2>>::value,
-               const tuple&, const __nonesuch&>::type __in)
+      operator=(const tuple& __in)
       {
        static_cast<_Inherited&>(*this) = __in;
        return *this;
       }
 
       tuple&
-      operator=(typename
-               conditional<__and_<is_move_assignable<_T1>,
-                                  is_move_assignable<_T2>>::value,
-               tuple&&, __nonesuch&&>::type __in)
+      operator=(tuple&& __in)
       noexcept(is_nothrow_move_assignable<_Inherited>::value)
       {
        static_cast<_Inherited&>(*this) = std::move(__in);
@@ -1254,10 +1204,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       }
 
       template<typename _U1, typename _U2>
-        typename
-          enable_if<__and_<is_assignable<_T1&, const _U1&>,
-                          is_assignable<_T2&, const _U2&>>::value,
-                          tuple&>::type
+        tuple&
         operator=(const tuple<_U1, _U2>& __in)
         {
          static_cast<_Inherited&>(*this) = __in;
@@ -1265,10 +1212,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        }
 
       template<typename _U1, typename _U2>
-        typename
-          enable_if<__and_<is_assignable<_T1&, _U1&&>,
-                          is_assignable<_T2&, _U2&&>>::value,
-                          tuple&>::type
+        tuple&
         operator=(tuple<_U1, _U2>&& __in)
         {
          static_cast<_Inherited&>(*this) = std::move(__in);
@@ -1276,10 +1220,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        }
 
       template<typename _U1, typename _U2>
-        typename
-          enable_if<__and_<is_assignable<_T1&, const _U1&>,
-                          is_assignable<_T2&, const _U2&>>::value,
-                          tuple&>::type
+        tuple&
         operator=(const pair<_U1, _U2>& __in)
         {
          this->_M_head(*this) = __in.first;
@@ -1288,10 +1229,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        }
 
       template<typename _U1, typename _U2>
-        typename
-          enable_if<__and_<is_assignable<_T1&, _U1&&>,
-                          is_assignable<_T2&, _U2&&>>::value,
-                          tuple&>::type
+        tuple&
         operator=(pair<_U1, _U2>&& __in)
         {
          this->_M_head(*this) = std::forward<_U1>(__in.first);
diff --git a/libstdc++-v3/testsuite/20_util/tuple/77802.cc b/libstdc++-v3/testsuite/20_util/tuple/77802.cc
new file mode 100644 (file)
index 0000000..8a52010
--- /dev/null
@@ -0,0 +1,49 @@
+// { dg-do compile { target c++11 } }
+
+// 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 <tuple>
+
+// This testcase instantiates a tuple with an incomplete type.
+// That is undefined behavior, but our tuple implementation manages
+// to cope with this particular case. The attempt to provide
+// a tuple implementation that yields the right result for
+// traits like is_copy_constructible and is_move_constructible as
+// per LWG 2729 results in ill-formed copy/move constructors being
+// generated for a tuple that contains an incomplete type.
+// Once we get concepts, we can solve that problem much easier.
+
+template <typename... Args> struct execution_context
+{
+  typedef std::tuple<Args...> args_tpl_t;
+  typedef std::tuple<execution_context, typename std::decay<Args>::type...>
+  ret_tpl_t;
+  execution_context();
+  execution_context(execution_context &&);
+  ret_tpl_t operator()() {
+    args_tpl_t data;
+    return tuple_cat(std::forward_as_tuple(execution_context()), data);
+  }
+};
+
+void fn1()
+{
+  execution_context<int> cc;
+  cc();
+}
+
index 1c08d459648d7513ca48807473fbab70da39cb3a..5bcf5761c360ed01bdfa4f2ae68f02178142cc4b 100644 (file)
@@ -17,7 +17,7 @@
 
 // { dg-options "-fno-show-column" }
 // { dg-do compile { target c++14 } }
-// { dg-error "in range" "" { target *-*-* } 1342 }
+// { dg-error "in range" "" { target *-*-* } 1280 }
 
 #include <tuple>
 
diff --git a/libstdc++-v3/testsuite/20_util/tuple/tuple_traits.cc b/libstdc++-v3/testsuite/20_util/tuple/tuple_traits.cc
deleted file mode 100644 (file)
index b72f535..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-// { dg-do compile { target c++11 } }
-
-// 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 <tuple>
-#include <type_traits>
-#include <utility>
-#include <vector>
-#include <memory>
-
-using namespace std;
-
-struct Poison
-{
-       Poison(Poison&&) = delete;
-};
-
-
-int main()
-{
-       static_assert(!is_copy_constructible<Poison>::value, "");
-       static_assert(!is_move_constructible<Poison>::value, "");
-       static_assert(!is_copy_assignable<Poison>::value, "");
-       static_assert(!is_move_assignable<Poison>::value, "");
-
-       static_assert(!is_copy_constructible<std::tuple<Poison>>::value, "");
-       static_assert(!is_move_constructible<std::tuple<Poison>>::value, "");
-       static_assert(!is_copy_assignable<std::tuple<Poison>>::value, "");
-       static_assert(!is_move_assignable<std::tuple<Poison>>::value, "");
-
-       static_assert(!is_copy_constructible<std::tuple<int, Poison>>::value,
-                     "");
-       static_assert(!is_move_constructible<std::tuple<int, Poison>>::value,
-                     "");
-       static_assert(!is_copy_assignable<std::tuple<int, Poison>>::value, "");
-       static_assert(!is_move_assignable<std::tuple<int, Poison>>::value, "");
-       static_assert(!is_constructible<std::tuple<int, Poison>&,
-                     std::tuple<char, Poison>&>::value, "");
-       static_assert(!is_assignable<std::tuple<int, Poison>&,
-                     std::tuple<char, Poison>&>::value, "");
-       static_assert(!is_constructible<std::tuple<int, Poison>&,
-                     std::tuple<char, Poison>>::value, "");
-       static_assert(!is_assignable<std::tuple<int, Poison>&,
-                     std::tuple<char, Poison>>::value, "");
-       static_assert(!is_constructible<std::tuple<int, Poison>&,
-                     std::pair<char, Poison>&>::value, "");
-       static_assert(!is_assignable<std::tuple<int, Poison>&,
-                     std::pair<char, Poison>&>::value, "");
-       static_assert(!is_constructible<std::tuple<int, Poison>&,
-                     std::pair<char, Poison>>::value, "");
-       static_assert(!is_assignable<std::tuple<int, Poison>&,
-                     std::pair<char, Poison>>::value, "");
-
-       static_assert(!is_copy_constructible<
-                     std::tuple<int, int, Poison>>::value, "");
-       static_assert(!is_move_constructible<
-                     std::tuple<int, int, Poison>>::value, "");
-       static_assert(!is_copy_assignable<
-                     std::tuple<int, int, Poison>>::value, "");
-       static_assert(!is_move_assignable<
-                     std::tuple<int, int, Poison>>::value, "");
-       static_assert(!is_constructible<
-                     std::tuple<int, int,Poison>&,
-                     std::tuple<int, char, Poison>&>::value, "");
-       static_assert(!is_assignable<
-                     std::tuple<int, int, Poison>&,
-                     std::tuple<int, char, Poison>&>::value, "");
-       static_assert(!is_constructible<
-                     std::tuple<int, int, Poison>&,
-                     std::tuple<int, char, Poison>>::value, "");
-       static_assert(!is_assignable<
-                     std::tuple<int, int, Poison>&,
-                     std::tuple<int, char, Poison>>::value, "");
-       static_assert(!is_constructible<
-                     std::tuple<int, int, Poison>&,
-                     std::pair<char, Poison>&>::value, "");
-       static_assert(!is_assignable<
-                     std::tuple<int, int, Poison>&,
-                     std::pair<char, Poison>&>::value, "");
-       static_assert(!is_constructible<
-                     std::tuple<int, int, Poison>&,
-                     std::pair<char, Poison>>::value, "");
-       static_assert(!is_assignable<
-                     std::tuple<int, int, Poison>&,
-                     std::pair<char, Poison>>::value, "");
-
-       static_assert(is_trivially_copy_constructible<tuple<int>>::value, "");
-       static_assert(!is_trivially_move_constructible<tuple<int>>::value, "");
-
-       static_assert(!is_trivially_copy_assignable<tuple<int>>::value, "");
-       static_assert(!is_trivially_move_assignable<tuple<int>>::value, "");
-
-       static_assert(is_copy_constructible<tuple<int>>::value, "");
-       static_assert(is_move_constructible<tuple<int>>::value, "");
-
-       static_assert(is_copy_assignable<tuple<int>>::value, "");
-       static_assert(is_move_assignable<tuple<int>>::value, "");
-
-       static_assert(!is_trivially_copy_constructible<
-                     tuple<vector<int>>>::value, "");
-       static_assert(!is_trivially_move_constructible<
-                     tuple<vector<int>>>::value, "");
-
-       static_assert(!is_trivially_copy_assignable<
-                     tuple<vector<int>>>::value, "");
-       static_assert(!is_trivially_move_assignable<
-                     tuple<vector<int>>>::value, "");
-
-       static_assert(is_copy_constructible<tuple<vector<int>>>::value, "");
-       static_assert(is_move_constructible<tuple<vector<int>>>::value, "");
-
-       static_assert(is_copy_assignable<tuple<vector<int>>>::value, "");
-       static_assert(is_move_assignable<tuple<vector<int>>>::value, "");
-
-       static_assert(!is_trivially_copy_constructible<
-                     tuple<unique_ptr<int>>>::value, "");
-       static_assert(!is_trivially_move_constructible<
-                     tuple<unique_ptr<int>>>::value, "");
-
-       static_assert(!is_trivially_copy_assignable<
-                     tuple<unique_ptr<int>>>::value, "");
-       static_assert(!is_trivially_move_assignable<
-                     tuple<unique_ptr<int>>>::value, "");
-       static_assert(!is_copy_constructible<
-                     tuple<unique_ptr<int>>>::value, "");
-       static_assert(is_move_constructible<tuple<unique_ptr<int>>>::value, "");
-
-       static_assert(!is_copy_assignable<tuple<unique_ptr<int>>>::value, "");
-       static_assert(is_move_assignable<tuple<unique_ptr<int>>>::value, "");
-
-       static_assert(is_trivially_copy_constructible<
-                     tuple<int, int>>::value, "");
-       static_assert(!is_trivially_move_constructible<
-                     tuple<int, int>>::value, "");
-
-       static_assert(!is_trivially_copy_assignable<
-                     tuple<int, int>>::value, "");
-       static_assert(!is_trivially_move_assignable<
-                     tuple<int, int>>::value, "");
-
-       static_assert(is_copy_constructible<tuple<int, int>>::value, "");
-       static_assert(is_move_constructible<tuple<int, int>>::value, "");
-
-       static_assert(is_copy_assignable<tuple<int, int>>::value, "");
-       static_assert(is_move_assignable<tuple<int, int>>::value, "");
-       static_assert(!is_trivially_copy_constructible<
-                     tuple<int, vector<int>>>::value, "");
-       static_assert(!is_trivially_move_constructible<
-                     tuple<int, vector<int>>>::value, "");
-
-       static_assert(!is_trivially_copy_assignable<
-                     tuple<int, vector<int>>>::value, "");
-       static_assert(!is_trivially_move_assignable<
-                     tuple<int, vector<int>>>::value, "");
-
-       static_assert(is_copy_constructible<
-                     tuple<int, vector<int>>>::value, "");
-       static_assert(is_move_constructible<
-                     tuple<int, vector<int>>>::value, "");
-
-       static_assert(is_copy_assignable<tuple<int, vector<int>>>::value, "");
-       static_assert(is_move_assignable<tuple<int, vector<int>>>::value, "");
-
-       static_assert(!is_trivially_copy_constructible<
-                     tuple<int, unique_ptr<int>>>::value, "");
-       static_assert(!is_trivially_move_constructible<
-                     tuple<int, unique_ptr<int>>>::value, "");
-
-       static_assert(!is_trivially_copy_assignable<
-                     tuple<int, unique_ptr<int>>>::value, "");
-       static_assert(!is_trivially_move_assignable<
-                     tuple<int, unique_ptr<int>>>::value, "");
-
-       static_assert(!is_copy_constructible<
-                     tuple<int, unique_ptr<int>>>::value, "");
-       static_assert(is_move_constructible<
-                     tuple<int, unique_ptr<int>>>::value, "");
-
-       static_assert(!is_copy_assignable<
-                     tuple<int, unique_ptr<int>>>::value, "");
-       static_assert(is_move_assignable<
-                     tuple<int, unique_ptr<int>>>::value, "");
-
-       static_assert(is_copy_constructible<tuple<int, int, int>>::value, "");
-       static_assert(is_move_constructible<tuple<int, int, int>>::value, "");
-
-       static_assert(is_copy_assignable<tuple<int, int, int>>::value, "");
-       static_assert(is_move_assignable<tuple<int, int, int>>::value, "");
-
-       static_assert(!is_trivially_copy_constructible<
-                     tuple<int, int, vector<int>>>::value, "");
-       static_assert(!is_trivially_move_constructible<
-                     tuple<int, int, vector<int>>>::value, "");
-
-       static_assert(!is_trivially_copy_assignable<
-                     tuple<int, int, vector<int>>>::value, "");
-       static_assert(!is_trivially_move_assignable<
-                     tuple<int, int, vector<int>>>::value, "");
-
-       static_assert(is_copy_constructible<
-                     tuple<int, int, vector<int>>>::value, "");
-       static_assert(is_move_constructible<
-                     tuple<int, int, vector<int>>>::value, "");
-
-       static_assert(is_copy_assignable<
-                     tuple<int, int, vector<int>>>::value, "");
-       static_assert(is_move_assignable<
-                     tuple<int, int, vector<int>>>::value, "");
-
-       static_assert(!is_trivially_copy_constructible<
-                     tuple<int, int, unique_ptr<int>>>::value, "");
-       static_assert(!is_trivially_move_constructible<
-                     tuple<int, int, unique_ptr<int>>>::value, "");
-
-       static_assert(!is_trivially_copy_assignable<
-                     tuple<int, int, unique_ptr<int>>>::value, "");
-       static_assert(!is_trivially_move_assignable<
-                     tuple<int, int, unique_ptr<int>>>::value, "");
-
-       static_assert(!is_copy_constructible<
-                     tuple<int, int, unique_ptr<int>>>::value, "");
-       static_assert(is_move_constructible<
-                     tuple<int, int, unique_ptr<int>>>::value, "");
-
-       static_assert(!is_copy_assignable<
-                     tuple<int, int, unique_ptr<int>>>::value, "");
-       static_assert(is_move_assignable<
-                     tuple<int, int, unique_ptr<int>>>::value, "");
-}