This patch makes swap functions constexpr. Both swap overloads, swap_ranges and iter_swap are updated (with tests).
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@365238 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/type_traits b/include/type_traits
index f954a81..5ccafec 100644
--- a/include/type_traits
+++ b/include/type_traits
@@ -3692,6 +3692,7 @@
#else
void
#endif
+_LIBCPP_CONSTEXPR_AFTER_CXX17
swap(_Tp& __x, _Tp& __y) _NOEXCEPT_(is_nothrow_move_constructible<_Tp>::value &&
is_nothrow_move_assignable<_Tp>::value)
{
@@ -3701,14 +3702,14 @@
}
template<class _Tp, size_t _Np>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
typename enable_if<
__is_swappable<_Tp>::value
>::type
swap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value);
template <class _ForwardIterator1, class _ForwardIterator2>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
void
iter_swap(_ForwardIterator1 __a, _ForwardIterator2 __b)
// _NOEXCEPT_(_NOEXCEPT_(swap(*__a, *__b)))
diff --git a/include/utility b/include/utility
index 8b45069..3961370 100644
--- a/include/utility
+++ b/include/utility
@@ -252,7 +252,7 @@
template <class _ForwardIterator1, class _ForwardIterator2>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
_ForwardIterator2
swap_ranges(_ForwardIterator1 __first1, _ForwardIterator1 __last1, _ForwardIterator2 __first2)
{
@@ -263,7 +263,7 @@
// forward declared in <type_traits>
template<class _Tp, size_t _Np>
-inline _LIBCPP_INLINE_VISIBILITY
+inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
typename enable_if<
__is_swappable<_Tp>::value
>::type
diff --git a/test/std/algorithms/alg.modifying.operations/alg.swap/iter_swap.pass.cpp b/test/std/algorithms/alg.modifying.operations/alg.swap/iter_swap.pass.cpp
index 2fbd905..b3a9f5f 100644
--- a/test/std/algorithms/alg.modifying.operations/alg.swap/iter_swap.pass.cpp
+++ b/test/std/algorithms/alg.modifying.operations/alg.swap/iter_swap.pass.cpp
@@ -18,6 +18,16 @@
#include "test_macros.h"
+#if TEST_STD_VER > 17
+constexpr bool test_swap_constexpr()
+{
+ int i = 1;
+ int j = 2;
+ std::iter_swap(&i, &j);
+ return i == 2 && j == 1;
+}
+#endif // TEST_STD_VER > 17
+
int main(int, char**)
{
int i = 1;
@@ -26,5 +36,9 @@
assert(i == 2);
assert(j == 1);
+#if TEST_STD_VER > 17
+ static_assert(test_swap_constexpr());
+#endif // TEST_STD_VER > 17
+
return 0;
}
diff --git a/test/std/algorithms/alg.modifying.operations/alg.swap/swap_ranges.pass.cpp b/test/std/algorithms/alg.modifying.operations/alg.swap/swap_ranges.pass.cpp
index a47bbd2..51671a0 100644
--- a/test/std/algorithms/alg.modifying.operations/alg.swap/swap_ranges.pass.cpp
+++ b/test/std/algorithms/alg.modifying.operations/alg.swap/swap_ranges.pass.cpp
@@ -105,6 +105,21 @@
}
}
+#if TEST_STD_VER > 17
+constexpr bool test_swap_constexpr()
+{
+ int i[3] = {1, 2, 3};
+ int j[3] = {4, 5, 6};
+ std::swap_ranges(i, i+3, j);
+ return i[0] == 4 &&
+ i[1] == 5 &&
+ i[2] == 6 &&
+ j[0] == 1 &&
+ j[1] == 2 &&
+ j[2] == 3;
+}
+#endif // TEST_STD_VER > 17
+
int main(int, char**)
{
test<forward_iterator<int*>, forward_iterator<int*> >();
@@ -149,6 +164,10 @@
test1<std::unique_ptr<int>*, std::unique_ptr<int>*>();
#endif // TEST_STD_VER >= 11
+#if TEST_STD_VER > 17
+ static_assert(test_swap_constexpr());
+#endif // TEST_STD_VER > 17
+
test2();
return 0;
diff --git a/test/std/utilities/utility/utility.swap/swap.pass.cpp b/test/std/utilities/utility/utility.swap/swap.pass.cpp
index f52af4c..c9146ee 100644
--- a/test/std/utilities/utility/utility.swap/swap.pass.cpp
+++ b/test/std/utilities/utility/utility.swap/swap.pass.cpp
@@ -62,6 +62,16 @@
}
#endif
+#if TEST_STD_VER > 17
+constexpr bool test_swap_constexpr()
+{
+ int i = 1;
+ int j = 2;
+ std::swap(i, j);
+ return i == 2 && j == 1;
+}
+#endif // TEST_STD_VER > 17
+
int main(int, char**)
{
@@ -100,5 +110,9 @@
}
#endif
+#if TEST_STD_VER > 17
+ static_assert(test_swap_constexpr());
+#endif // TEST_STD_VER > 17
+
return 0;
}
diff --git a/test/std/utilities/utility/utility.swap/swap_array.pass.cpp b/test/std/utilities/utility/utility.swap/swap_array.pass.cpp
index 015e85a..512505b 100644
--- a/test/std/utilities/utility/utility.swap/swap_array.pass.cpp
+++ b/test/std/utilities/utility/utility.swap/swap_array.pass.cpp
@@ -53,6 +53,20 @@
}
#endif
+#if TEST_STD_VER > 17
+constexpr bool test_swap_constexpr()
+{
+ int i[3] = {1, 2, 3};
+ int j[3] = {4, 5, 6};
+ std::swap(i, j);
+ return i[0] == 4 &&
+ i[1] == 5 &&
+ i[2] == 6 &&
+ j[0] == 1 &&
+ j[1] == 2 &&
+ j[2] == 3;
+}
+#endif // TEST_STD_VER > 17
int main(int, char**)
{
@@ -98,5 +112,9 @@
}
#endif
+#if TEST_STD_VER > 17
+ static_assert(test_swap_constexpr());
+#endif // TEST_STD_VER > 17
+
return 0;
}