re PR libstdc++/65978 (missing constexpr on std::forward_as_tuple and std::tie (LWG...
authorJonathan Wakely <jwakely@redhat.com>
Sat, 2 May 2015 11:20:03 +0000 (12:20 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Sat, 2 May 2015 11:20:03 +0000 (12:20 +0100)
PR libstdc++/65978
* include/std/tuple (forward_as_tuple, tie): Add constexpr.
* testsuite/20_util/tuple/creation_functions/constexpr.cc: Uncomment
and fix tests for forward_as_tuple and tie.

From-SVN: r222719

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/tuple
libstdc++-v3/testsuite/20_util/tuple/creation_functions/constexpr.cc

index 521ca9cb9dfba6e37aa0b3ad037321c34f899ecd..9ba7c30d7ecaaa955d1681bbd5ba2867bfa47ab4 100644 (file)
@@ -1,5 +1,10 @@
 2015-05-02  Jonathan Wakely  <jwakely@redhat.com>
 
+       PR libstdc++/65978
+       * include/std/tuple (forward_as_tuple, tie): Add constexpr.
+       * testsuite/20_util/tuple/creation_functions/constexpr.cc: Uncomment
+       and fix tests for forward_as_tuple and tie.
+
        * src/filesystem/ops.cc (last_write_time) [_GLIBCXX_USE_UTIMENSAT]:
        Set timespec members explicitly instead of with a braced-init-list.
        [_GLIBCXX_HAVE_UTIME_H]: Use lambda to handle st_atime being a macro.
index e500a762d876f6d3c0e9b25c28de4c050caf67cb..ad132bd83084af838a748ab3b12f1915bafd24af 100644 (file)
@@ -970,8 +970,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return __result_type(std::forward<_Elements>(__args)...);
     }
 
+  // _GLIBCXX_RESOLVE_LIB_DEFECTS
+  // 2275. Why is forward_as_tuple not constexpr?
   template<typename... _Elements>
-    tuple<_Elements&&...>
+    constexpr tuple<_Elements&&...>
     forward_as_tuple(_Elements&&... __args) noexcept
     { return tuple<_Elements&&...>(std::forward<_Elements>(__args)...); }
 
@@ -1120,9 +1122,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return __concater::_S_do(std::forward<_Tpls>(__tpls)...);
     }
 
+  // _GLIBCXX_RESOLVE_LIB_DEFECTS
+  // 2301. Why is tie not constexpr?
   /// tie
   template<typename... _Elements>
-    inline tuple<_Elements&...>
+    constexpr tuple<_Elements&...>
     tie(_Elements&... __args) noexcept
     { return tuple<_Elements&...>(__args...); }
 
index 2c47fbb2c31056c4720f077d093517652bf563bf..3ededfcf5507e8026e1c8c7ec0e14f421e91f8a5 100644 (file)
@@ -45,49 +45,51 @@ test_make_tuple()
   }
 }
 
-#if 0
 // forward_as_tuple
 void
 test_forward_as_tuple()
 {
   {
-    typedef std::tuple<int, float> tuple_type;
+    static int i(22);
+    static float f(22.222);
+    typedef std::tuple<int&, float&&> tuple_type;
     constexpr tuple_type p1 __attribute__((unused))
-      = std::forward_as_tuple(22, 22.222);
+      = std::forward_as_tuple(i, std::move(f));
   }
 
   {
-    typedef std::tuple<int, float, int> tuple_type;
+    static int i(22);
+    static float f(22.222);
+    static int ii(77799);
+
+    typedef std::tuple<int&, float&, int&&> tuple_type;
     constexpr tuple_type p1 __attribute__((unused))
-      = std::forward_as_tuple(22, 22.222, 77799);
+      = std::forward_as_tuple(i, f, std::move(ii));
   }
 }
-#endif
 
-#if 0
 // tie
 void
 test_tie()
 {
   {
-    int i(22);
-    float f(22.222);
-    typedef std::tuple<int, float> tuple_type;
+    static int i(22);
+    static float f(22.222);
+    typedef std::tuple<int&, float&> tuple_type;
     constexpr tuple_type p1 __attribute__((unused))
       = std::tie(i, f);
   }
 
   {
-    int i(22);
-    float f(22.222);
-    int ii(77799);
+    static int i(22);
+    static float f(22.222);
+    static const int ii(77799);
 
-    typedef std::tuple<int, float, int> tuple_type;
+    typedef std::tuple<int&, float&, const int&> tuple_type;
     constexpr tuple_type p1 __attribute__((unused))
       = std::tie(i, f, ii);
   }
 }
-#endif
 
 // get
 void
@@ -124,6 +126,8 @@ int
 main()
 {
   test_make_tuple();
+  test_forward_as_tuple();
+  test_tie();
   test_get();
   test_tuple_cat();