Define __cpp_lib_tuple_element_t in <tuple> not <utility>

Message ID 20180614140055.GA6899@redhat.com
State New
Headers show
Series
  • Define __cpp_lib_tuple_element_t in <tuple> not <utility>
Related show

Commit Message

Jonathan Wakely June 14, 2018, 2 p.m.
During the review of P0941R2 in Rapperswil we noticed that SD-6 puts
the macro __cpp_lib_tuple_element_t in <utility>, but it should be in
<tuple>.

	* include/std/tuple (__cpp_lib_tuple_element_t): Move feature test
	macro from <utility> and change type to long.
	* include/std/utility (__cpp_lib_tuple_element_t): Remove.
	* testsuite/20_util/tuple/tuple_element_t.cc: Check for feature test
	macro.

Tested x86_64-linux, committed to trunk.
commit 4f01bc22bdabe1fd70e9bf67cfed07880eb2f754
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Jun 14 14:41:50 2018 +0100

    Define __cpp_lib_tuple_element_t in <tuple> not <utility>
    
            * include/std/tuple (__cpp_lib_tuple_element_t): Move feature test
            macro from <utility> and change type to long.
            * include/std/utility (__cpp_lib_tuple_element_t): Remove.
            * testsuite/20_util/tuple/tuple_element_t.cc: Check for feature test
            macro.

Comments

Jonathan Wakely June 14, 2018, 7:08 p.m. | #1
On 14/06/18 15:00 +0100, Jonathan Wakely wrote:
>During the review of P0941R2 in Rapperswil we noticed that SD-6 puts

>the macro __cpp_lib_tuple_element_t in <utility>, but it should be in

><tuple>.

>

>	* include/std/tuple (__cpp_lib_tuple_element_t): Move feature test

>	macro from <utility> and change type to long.

>	* include/std/utility (__cpp_lib_tuple_element_t): Remove.

>	* testsuite/20_util/tuple/tuple_element_t.cc: Check for feature test

>	macro.

>

>Tested x86_64-linux, committed to trunk.


This caused some tests to fail (but not for me, maybe because of
precompiled headers). I'm moving the macro and the alias template back
to <utility>, but keeping the change of the macro value from int to
long (as required by the C++2a working paper).

Tested powerpc64le-linux, committed to trunk.
commit 378a13153d1761f68c5c783d7502761b37e711f5
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Jun 14 19:44:42 2018 +0100

    Partially revert move of std::tuple_element_t to <tuple>
    
    Defining std::tuple_element_t in <utility> makes it available wherever
    std::tuple_element is available.
    
            * include/std/tuple (__cpp_lib_tuple_element_t, tuple_element_t):
            Move back to <utility>.
            * include/std/utility (__cpp_lib_tuple_element_t. tuple_element_t):
            Restore to here.

diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple
index 0f890504889..dd7daf7f1cf 100644
--- a/libstdc++-v3/include/std/tuple
+++ b/libstdc++-v3/include/std/tuple
@@ -1298,13 +1298,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  "tuple index is in range");
     };
 
-#if __cplusplus >= 201402L
-#define __cpp_lib_tuple_element_t 201402L
-
-  template<size_t __i, typename _Tp>
-    using tuple_element_t = typename tuple_element<__i, _Tp>::type;
-#endif
-
   template<std::size_t __i, typename _Head, typename... _Tail>
     constexpr _Head&
     __get_helper(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
diff --git a/libstdc++-v3/include/std/utility b/libstdc++-v3/include/std/utility
index 7bf80de3745..17e7d4cbe7a 100644
--- a/libstdc++-v3/include/std/utility
+++ b/libstdc++-v3/include/std/utility
@@ -135,6 +135,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       typedef typename add_cv<__tuple_element_t<__i, _Tp>>::type type;
     };
 
+#if __cplusplus >= 201402L
+// The standard says this macro and alias template should be in <tuple>
+// but we define them here, to be available when the partial specializations
+// of tuple_element<pair<T,U>> and tuple_element<array<T,N>> are defined.
+#define __cpp_lib_tuple_element_t 201402L
+
+  template<std::size_t __i, typename _Tp>
+    using tuple_element_t = typename tuple_element<__i, _Tp>::type;
+#endif
+
   // Various functions which give std::pair a tuple-like interface.
 
   /// Partial specialization for std::pair

Patch

diff --git a/libstdc++-v3/include/std/tuple b/libstdc++-v3/include/std/tuple
index 16f69220abb..0f890504889 100644
--- a/libstdc++-v3/include/std/tuple
+++ b/libstdc++-v3/include/std/tuple
@@ -1298,6 +1298,13 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	  "tuple index is in range");
     };
 
+#if __cplusplus >= 201402L
+#define __cpp_lib_tuple_element_t 201402L
+
+  template<size_t __i, typename _Tp>
+    using tuple_element_t = typename tuple_element<__i, _Tp>::type;
+#endif
+
   template<std::size_t __i, typename _Head, typename... _Tail>
     constexpr _Head&
     __get_helper(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
@@ -1338,7 +1345,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return std::forward<const __element_type&&>(std::get<__i>(__t));
     }
 
-#if __cplusplus > 201103L
+#if __cplusplus >= 201402L
 
 #define __cpp_lib_tuples_by_type 201304
 
@@ -1470,6 +1477,7 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   // _GLIBCXX_RESOLVE_LIB_DEFECTS
   // 2275. Why is forward_as_tuple not constexpr?
+  /// std::forward_as_tuple
   template<typename... _Elements>
     constexpr tuple<_Elements&&...>
     forward_as_tuple(_Elements&&... __args) noexcept
diff --git a/libstdc++-v3/include/std/utility b/libstdc++-v3/include/std/utility
index c9695006ff1..7bf80de3745 100644
--- a/libstdc++-v3/include/std/utility
+++ b/libstdc++-v3/include/std/utility
@@ -135,13 +135,6 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       typedef typename add_cv<__tuple_element_t<__i, _Tp>>::type type;
     };
 
-#if __cplusplus > 201103L
-#define __cpp_lib_tuple_element_t 201402
-
-  template<std::size_t __i, typename _Tp>
-    using tuple_element_t = typename tuple_element<__i, _Tp>::type;
-#endif
-
   // Various functions which give std::pair a tuple-like interface.
 
   /// Partial specialization for std::pair
diff --git a/libstdc++-v3/testsuite/20_util/tuple/tuple_element_t.cc b/libstdc++-v3/testsuite/20_util/tuple/tuple_element_t.cc
index 8f7aa58d34e..6b1b7a54251 100644
--- a/libstdc++-v3/testsuite/20_util/tuple/tuple_element_t.cc
+++ b/libstdc++-v3/testsuite/20_util/tuple/tuple_element_t.cc
@@ -19,6 +19,12 @@ 
 
 #include <tuple>
 
+#ifndef __cpp_lib_tuple_element_t
+# error "Feature-test macro for tuple_element_t missing"
+#elif __cpp_lib_tuple_element_t != 201402
+# error "Feature-test macro for tuple_element_t has wrong value"
+#endif
+
 using namespace std;
 
 struct foo