[libcxx] r186344 - Make std::forward and std::move (and std::move_if_noexcept) constexpr in C++14

Marshall Clow mclow.lists at gmail.com
Mon Jul 15 13:46:11 PDT 2013


Author: marshall
Date: Mon Jul 15 15:46:11 2013
New Revision: 186344

URL: http://llvm.org/viewvc/llvm-project?rev=186344&view=rev
Log:
Make std::forward and std::move (and std::move_if_noexcept) constexpr in C++14

Modified:
    libcxx/trunk/include/tuple
    libcxx/trunk/include/type_traits
    libcxx/trunk/include/utility
    libcxx/trunk/test/utilities/utility/forward/forward.pass.cpp
    libcxx/trunk/test/utilities/utility/forward/move_if_noexcept.pass.cpp

Modified: libcxx/trunk/include/tuple
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/tuple?rev=186344&r1=186343&r2=186344&view=diff
==============================================================================
--- libcxx/trunk/include/tuple (original)
+++ libcxx/trunk/include/tuple Mon Jul 15 15:46:11 2013
@@ -843,7 +843,7 @@ template <class _T1, class... _Args>
 inline _LIBCPP_INLINE_VISIBILITY
 constexpr _T1&& get(tuple<_Args...>&& __tup) noexcept
 {
-    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move<tuple<_Args...>>(__tup));
+    return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));
 }
 
 #endif

Modified: libcxx/trunk/include/type_traits
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=186344&r1=186343&r2=186344&view=diff
==============================================================================
--- libcxx/trunk/include/type_traits (original)
+++ libcxx/trunk/include/type_traits Mon Jul 15 15:46:11 2013
@@ -1466,7 +1466,7 @@ struct is_destructible
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 
 template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
 typename remove_reference<_Tp>::type&&
 move(_Tp&& __t) _NOEXCEPT
 {
@@ -1475,7 +1475,7 @@ move(_Tp&& __t) _NOEXCEPT
 }
 
 template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
 _Tp&&
 forward(typename std::remove_reference<_Tp>::type& __t) _NOEXCEPT
 {
@@ -1483,7 +1483,7 @@ forward(typename std::remove_reference<_
 }
 
 template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
 _Tp&&
 forward(typename std::remove_reference<_Tp>::type&& __t) _NOEXCEPT
 {

Modified: libcxx/trunk/include/utility
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/utility?rev=186344&r1=186343&r2=186344&view=diff
==============================================================================
--- libcxx/trunk/include/utility (original)
+++ libcxx/trunk/include/utility Mon Jul 15 15:46:11 2013
@@ -38,10 +38,10 @@ template <class T, size_t N>
 void
 swap(T (&a)[N], T (&b)[N]) noexcept(noexcept(swap(*a, *b)));
 
-template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept;
-template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept;
+template <class T> T&& forward(typename remove_reference<T>::type& t) noexcept;  // constexpr in C++14
+template <class T> T&& forward(typename remove_reference<T>::type&& t) noexcept; // constexpr in C++14
 
-template <class T> typename remove_reference<T>::type&& move(T&&) noexcept;
+template <class T> typename remove_reference<T>::type&& move(T&&) noexcept;      // constexpr in C++14
 
 template <class T>
     typename conditional
@@ -50,7 +50,7 @@ template <class T>
         const T&,
         T&&
     >::type
-    move_if_noexcept(T& x) noexcept;
+    move_if_noexcept(T& x) noexcept; // constexpr in C++14
 
 template <class T> typename add_rvalue_reference<T>::type declval() noexcept;
 
@@ -221,7 +221,7 @@ swap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _
 }
 
 template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
 typename conditional
 <

Modified: libcxx/trunk/test/utilities/utility/forward/forward.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/utility/forward/forward.pass.cpp?rev=186344&r1=186343&r2=186344&view=diff
==============================================================================
--- libcxx/trunk/test/utilities/utility/forward/forward.pass.cpp (original)
+++ libcxx/trunk/test/utilities/utility/forward/forward.pass.cpp Mon Jul 15 15:46:11 2013
@@ -70,4 +70,11 @@ int main()
     static_assert(sizeof(test(std::forward<const A>(ca))) == 2, "");
     static_assert(sizeof(test(std::forward<const A>(csource()))) == 2, "");
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
+
+#if _LIBCPP_STD_VER > 11
+	constexpr int i1 = std::move(23);
+	static_assert(i1 == 23, "" );
+	constexpr int i2 = std::forward<int>(42);
+	static_assert(i2 == 42, "" );
+#endif
 }

Modified: libcxx/trunk/test/utilities/utility/forward/move_if_noexcept.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/utility/forward/move_if_noexcept.pass.cpp?rev=186344&r1=186343&r2=186344&view=diff
==============================================================================
--- libcxx/trunk/test/utilities/utility/forward/move_if_noexcept.pass.cpp (original)
+++ libcxx/trunk/test/utilities/utility/forward/move_if_noexcept.pass.cpp Mon Jul 15 15:46:11 2013
@@ -60,4 +60,10 @@ int main()
 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
     static_assert((std::is_same<decltype(std::move_if_noexcept(l)), const legacy&>::value), "");
 
+#if _LIBCPP_STD_VER > 11
+	constexpr int i1 = 23;
+	constexpr int i2 = std::move_if_noexcept(i1);
+	static_assert(i2 == 23, "" );
+#endif
+
 }





More information about the cfe-commits mailing list