forked from OSchip/llvm-project
[Take 2] [libc++] Make rotate a constexpr.
This patch makes `std::rotate` a constexpr. In doing so, this patch also
updates the internal `__move` and `__move_backward` funtions to be
constexpr.
This patch was previously reverted in ed653184ac
because it was missing
some UNSUPPORTED markup for older compilers. This commit adds it.
Differential Revision: https://reviews.llvm.org/D65721
This commit is contained in:
parent
ed653184ac
commit
3ed89b51da
|
@ -1631,7 +1631,7 @@ search_n(_ForwardIterator __first, _ForwardIterator __last, _Size __count, const
|
|||
|
||||
// copy
|
||||
template <class _Iter>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
_Iter
|
||||
__unwrap_iter(_Iter __i)
|
||||
{
|
||||
|
@ -1639,7 +1639,7 @@ __unwrap_iter(_Iter __i)
|
|||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
typename enable_if
|
||||
<
|
||||
is_trivially_copy_assignable<_Tp>::value,
|
||||
|
@ -1653,7 +1653,7 @@ __unwrap_iter(move_iterator<_Tp*> __i)
|
|||
#if _LIBCPP_DEBUG_LEVEL < 2
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
typename enable_if
|
||||
<
|
||||
is_trivially_copy_assignable<_Tp>::value,
|
||||
|
@ -1665,7 +1665,7 @@ __unwrap_iter(__wrap_iter<_Tp*> __i)
|
|||
}
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
typename enable_if
|
||||
<
|
||||
is_trivially_copy_assignable<_Tp>::value,
|
||||
|
@ -1679,7 +1679,7 @@ __unwrap_iter(__wrap_iter<const _Tp*> __i)
|
|||
#else
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
typename enable_if
|
||||
<
|
||||
is_trivially_copy_assignable<_Tp>::value,
|
||||
|
@ -1859,18 +1859,28 @@ copy_n(_InputIterator __first, _Size __orig_n, _OutputIterator __result)
|
|||
|
||||
// move
|
||||
|
||||
// __move_constexpr exists so that __move doesn't call itself when delegating to the constexpr
|
||||
// version of __move.
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
_OutputIterator
|
||||
__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
|
||||
__move_constexpr(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
|
||||
{
|
||||
for (; __first != __last; ++__first, (void) ++__result)
|
||||
*__result = _VSTD::move(*__first);
|
||||
return __result;
|
||||
}
|
||||
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
_OutputIterator
|
||||
__move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
|
||||
{
|
||||
return __move_constexpr(__first, __last, __result);
|
||||
}
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
typename enable_if
|
||||
<
|
||||
is_same<typename remove_const<_Tp>::type, _Up>::value &&
|
||||
|
@ -1879,6 +1889,8 @@ typename enable_if
|
|||
>::type
|
||||
__move(_Tp* __first, _Tp* __last, _Up* __result)
|
||||
{
|
||||
if (__libcpp_is_constant_evaluated())
|
||||
return __move_constexpr(__first, __last, __result);
|
||||
const size_t __n = static_cast<size_t>(__last - __first);
|
||||
if (__n > 0)
|
||||
_VSTD::memmove(__result, __first, __n * sizeof(_Up));
|
||||
|
@ -1886,7 +1898,7 @@ __move(_Tp* __first, _Tp* __last, _Up* __result)
|
|||
}
|
||||
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_OutputIterator
|
||||
move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
|
||||
{
|
||||
|
@ -1895,18 +1907,28 @@ move(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
|
|||
|
||||
// move_backward
|
||||
|
||||
// __move_backward_constexpr exists so that __move_backward doesn't call itself when delegating to
|
||||
// the constexpr version of __move_backward.
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
_OutputIterator
|
||||
__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
|
||||
__move_backward_constexpr(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
|
||||
{
|
||||
while (__first != __last)
|
||||
*--__result = _VSTD::move(*--__last);
|
||||
return __result;
|
||||
}
|
||||
|
||||
template <class _InputIterator, class _OutputIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
_OutputIterator
|
||||
__move_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result)
|
||||
{
|
||||
return __move_backward_constexpr(__first, __last, __result);
|
||||
}
|
||||
|
||||
template <class _Tp, class _Up>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14
|
||||
typename enable_if
|
||||
<
|
||||
is_same<typename remove_const<_Tp>::type, _Up>::value &&
|
||||
|
@ -1915,6 +1937,8 @@ typename enable_if
|
|||
>::type
|
||||
__move_backward(_Tp* __first, _Tp* __last, _Up* __result)
|
||||
{
|
||||
if (__libcpp_is_constant_evaluated())
|
||||
return __move_backward_constexpr(__first, __last, __result);
|
||||
const size_t __n = static_cast<size_t>(__last - __first);
|
||||
if (__n > 0)
|
||||
{
|
||||
|
@ -1925,7 +1949,7 @@ __move_backward(_Tp* __first, _Tp* __last, _Up* __result)
|
|||
}
|
||||
|
||||
template <class _BidirectionalIterator1, class _BidirectionalIterator2>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
|
||||
_BidirectionalIterator2
|
||||
move_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last,
|
||||
_BidirectionalIterator2 __result)
|
||||
|
@ -2333,7 +2357,7 @@ reverse_copy(_BidirectionalIterator __first, _BidirectionalIterator __last, _Out
|
|||
// rotate
|
||||
|
||||
template <class _ForwardIterator>
|
||||
_ForwardIterator
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator
|
||||
__rotate_left(_ForwardIterator __first, _ForwardIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_ForwardIterator>::value_type value_type;
|
||||
|
@ -2344,7 +2368,7 @@ __rotate_left(_ForwardIterator __first, _ForwardIterator __last)
|
|||
}
|
||||
|
||||
template <class _BidirectionalIterator>
|
||||
_BidirectionalIterator
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _BidirectionalIterator
|
||||
__rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_BidirectionalIterator>::value_type value_type;
|
||||
|
@ -2356,7 +2380,7 @@ __rotate_right(_BidirectionalIterator __first, _BidirectionalIterator __last)
|
|||
}
|
||||
|
||||
template <class _ForwardIterator>
|
||||
_ForwardIterator
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX14 _ForwardIterator
|
||||
__rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
|
||||
{
|
||||
_ForwardIterator __i = __middle;
|
||||
|
@ -2392,7 +2416,7 @@ __rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIt
|
|||
|
||||
template<typename _Integral>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_Integral
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX14 _Integral
|
||||
__algo_gcd(_Integral __x, _Integral __y)
|
||||
{
|
||||
do
|
||||
|
@ -2405,7 +2429,7 @@ __algo_gcd(_Integral __x, _Integral __y)
|
|||
}
|
||||
|
||||
template<typename _RandomAccessIterator>
|
||||
_RandomAccessIterator
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX14 _RandomAccessIterator
|
||||
__rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last)
|
||||
{
|
||||
typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
|
||||
|
@ -2441,7 +2465,7 @@ __rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _Ran
|
|||
|
||||
template <class _ForwardIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_ForwardIterator
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _ForwardIterator
|
||||
__rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last,
|
||||
_VSTD::forward_iterator_tag)
|
||||
{
|
||||
|
@ -2456,7 +2480,7 @@ __rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator _
|
|||
|
||||
template <class _BidirectionalIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_BidirectionalIterator
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _BidirectionalIterator
|
||||
__rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, _BidirectionalIterator __last,
|
||||
_VSTD::bidirectional_iterator_tag)
|
||||
{
|
||||
|
@ -2473,7 +2497,7 @@ __rotate(_BidirectionalIterator __first, _BidirectionalIterator __middle, _Bidir
|
|||
|
||||
template <class _RandomAccessIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_RandomAccessIterator
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX11 _RandomAccessIterator
|
||||
__rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last,
|
||||
_VSTD::random_access_iterator_tag)
|
||||
{
|
||||
|
@ -2491,7 +2515,7 @@ __rotate(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomA
|
|||
|
||||
template <class _ForwardIterator>
|
||||
inline _LIBCPP_INLINE_VISIBILITY
|
||||
_ForwardIterator
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
|
||||
rotate(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIterator __last)
|
||||
{
|
||||
if (__first == __middle)
|
||||
|
|
|
@ -1393,13 +1393,13 @@ operator+(typename __wrap_iter<_Iter>::difference_type, __wrap_iter<_Iter>) _NOE
|
|||
|
||||
template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 copy(_Ip, _Ip, _Op);
|
||||
template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 copy_backward(_B1, _B1, _B2);
|
||||
template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY move(_Ip, _Ip, _Op);
|
||||
template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY move_backward(_B1, _B1, _B2);
|
||||
template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 move(_Ip, _Ip, _Op);
|
||||
template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 move_backward(_B1, _B1, _B2);
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL < 2
|
||||
|
||||
template <class _Tp>
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
|
||||
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
typename enable_if
|
||||
<
|
||||
is_trivially_copy_assignable<_Tp>::value,
|
||||
|
@ -1410,7 +1410,7 @@ __unwrap_iter(__wrap_iter<_Tp*>);
|
|||
#else
|
||||
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
typename enable_if
|
||||
<
|
||||
is_trivially_copy_assignable<_Tp>::value,
|
||||
|
@ -1604,12 +1604,12 @@ private:
|
|||
|
||||
template <class _Ip, class _Op> friend _LIBCPP_CONSTEXPR_AFTER_CXX17 _Op copy(_Ip, _Ip, _Op);
|
||||
template <class _B1, class _B2> friend _LIBCPP_CONSTEXPR_AFTER_CXX17 _B2 copy_backward(_B1, _B1, _B2);
|
||||
template <class _Ip, class _Op> friend _Op move(_Ip, _Ip, _Op);
|
||||
template <class _B1, class _B2> friend _B2 move_backward(_B1, _B1, _B2);
|
||||
template <class _Ip, class _Op> friend _LIBCPP_CONSTEXPR_AFTER_CXX17 _Op move(_Ip, _Ip, _Op);
|
||||
template <class _B1, class _B2> friend _LIBCPP_CONSTEXPR_AFTER_CXX17 _B2 move_backward(_B1, _B1, _B2);
|
||||
|
||||
#if _LIBCPP_DEBUG_LEVEL < 2
|
||||
template <class _Tp>
|
||||
_LIBCPP_CONSTEXPR_IF_NODEBUG friend
|
||||
_LIBCPP_CONSTEXPR friend
|
||||
typename enable_if
|
||||
<
|
||||
is_trivially_copy_assignable<_Tp>::value,
|
||||
|
@ -1618,7 +1618,7 @@ private:
|
|||
__unwrap_iter(__wrap_iter<_Tp*>);
|
||||
#else
|
||||
template <class _Tp>
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG
|
||||
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
|
||||
typename enable_if
|
||||
<
|
||||
is_trivially_copy_assignable<_Tp>::value,
|
||||
|
|
|
@ -13,6 +13,11 @@
|
|||
// OutIter
|
||||
// move(InIter first, InIter last, OutIter result);
|
||||
|
||||
// Older compilers don't support std::is_constant_evaluated
|
||||
// UNSUPPORTED: clang-4, clang-5, clang-6, clang-7, clang-8
|
||||
// UNSUPPORTED: apple-clang-9, apple-clang-10, apple-clang-11
|
||||
// UNSUPPORTED: gcc-5, gcc-6, gcc-7, gcc-8
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <memory>
|
||||
|
@ -21,11 +26,11 @@
|
|||
#include "test_iterators.h"
|
||||
|
||||
template <class InIter, class OutIter>
|
||||
void
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
test()
|
||||
{
|
||||
const unsigned N = 1000;
|
||||
int ia[N];
|
||||
int ia[N] = {};
|
||||
for (unsigned i = 0; i < N; ++i)
|
||||
ia[i] = i;
|
||||
int ib[N] = {0};
|
||||
|
@ -34,6 +39,8 @@ test()
|
|||
assert(base(r) == ib+N);
|
||||
for (unsigned i = 0; i < N; ++i)
|
||||
assert(ia[i] == ib[i]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#if TEST_STD_VER >= 11
|
||||
|
@ -128,5 +135,37 @@ int main(int, char**)
|
|||
test1<std::unique_ptr<int>*, std::unique_ptr<int>*>();
|
||||
#endif // TEST_STD_VER >= 11
|
||||
|
||||
#if TEST_STD_VER > 17
|
||||
static_assert(test<input_iterator<const int*>, input_iterator<int*> >());
|
||||
static_assert(test<input_iterator<const int*>, forward_iterator<int*> >());
|
||||
static_assert(test<input_iterator<const int*>, bidirectional_iterator<int*> >());
|
||||
static_assert(test<input_iterator<const int*>, random_access_iterator<int*> >());
|
||||
static_assert(test<input_iterator<const int*>, int*>());
|
||||
|
||||
static_assert(test<forward_iterator<const int*>, input_iterator<int*> >());
|
||||
static_assert(test<forward_iterator<const int*>, forward_iterator<int*> >());
|
||||
static_assert(test<forward_iterator<const int*>, bidirectional_iterator<int*> >());
|
||||
static_assert(test<forward_iterator<const int*>, random_access_iterator<int*> >());
|
||||
static_assert(test<forward_iterator<const int*>, int*>());
|
||||
|
||||
static_assert(test<bidirectional_iterator<const int*>, input_iterator<int*> >());
|
||||
static_assert(test<bidirectional_iterator<const int*>, forward_iterator<int*> >());
|
||||
static_assert(test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >());
|
||||
static_assert(test<bidirectional_iterator<const int*>, random_access_iterator<int*> >());
|
||||
static_assert(test<bidirectional_iterator<const int*>, int*>());
|
||||
|
||||
static_assert(test<random_access_iterator<const int*>, input_iterator<int*> >());
|
||||
static_assert(test<random_access_iterator<const int*>, forward_iterator<int*> >());
|
||||
static_assert(test<random_access_iterator<const int*>, bidirectional_iterator<int*> >());
|
||||
static_assert(test<random_access_iterator<const int*>, random_access_iterator<int*> >());
|
||||
static_assert(test<random_access_iterator<const int*>, int*>());
|
||||
|
||||
static_assert(test<const int*, input_iterator<int*> >());
|
||||
static_assert(test<const int*, forward_iterator<int*> >());
|
||||
static_assert(test<const int*, bidirectional_iterator<int*> >());
|
||||
static_assert(test<const int*, random_access_iterator<int*> >());
|
||||
static_assert(test<const int*, int*>());
|
||||
#endif // TEST_STD_VER > 17
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -6,6 +6,10 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// Older compilers don't support std::is_constant_evaluated
|
||||
// UNSUPPORTED: clang-4, clang-5, clang-6, clang-7, clang-8
|
||||
// UNSUPPORTED: apple-clang-9, apple-clang-10
|
||||
|
||||
// <algorithm>
|
||||
|
||||
// template<BidirectionalIterator InIter, BidirectionalIterator OutIter>
|
||||
|
@ -21,11 +25,11 @@
|
|||
#include "test_iterators.h"
|
||||
|
||||
template <class InIter, class OutIter>
|
||||
void
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
test()
|
||||
{
|
||||
const unsigned N = 1000;
|
||||
int ia[N];
|
||||
int ia[N] = {};
|
||||
for (unsigned i = 0; i < N; ++i)
|
||||
ia[i] = i;
|
||||
int ib[N] = {0};
|
||||
|
@ -34,6 +38,8 @@ test()
|
|||
assert(base(r) == ib);
|
||||
for (unsigned i = 0; i < N; ++i)
|
||||
assert(ia[i] == ib[i]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#if TEST_STD_VER >= 11
|
||||
|
@ -82,5 +88,19 @@ int main(int, char**)
|
|||
test1<std::unique_ptr<int>*, std::unique_ptr<int>*>();
|
||||
#endif // TEST_STD_VER >= 11
|
||||
|
||||
#if TEST_STD_VER > 17
|
||||
static_assert(test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >());
|
||||
static_assert(test<bidirectional_iterator<const int*>, random_access_iterator<int*> >());
|
||||
static_assert(test<bidirectional_iterator<const int*>, int*>());
|
||||
|
||||
static_assert(test<random_access_iterator<const int*>, bidirectional_iterator<int*> >());
|
||||
static_assert(test<random_access_iterator<const int*>, random_access_iterator<int*> >());
|
||||
static_assert(test<random_access_iterator<const int*>, int*>());
|
||||
|
||||
static_assert(test<const int*, bidirectional_iterator<int*> >());
|
||||
static_assert(test<const int*, random_access_iterator<int*> >());
|
||||
static_assert(test<const int*, int*>());
|
||||
#endif // TEST_STD_VER > 17
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,10 @@
|
|||
// Iter
|
||||
// rotate(Iter first, Iter middle, Iter last);
|
||||
|
||||
// Older compilers don't support std::is_constant_evaluated
|
||||
// UNSUPPORTED: clang-4, clang-5, clang-6, clang-7, clang-8
|
||||
// UNSUPPORTED: apple-clang-9, apple-clang-10
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <memory>
|
||||
|
@ -20,7 +24,7 @@
|
|||
#include "test_iterators.h"
|
||||
|
||||
template <class Iter>
|
||||
void
|
||||
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
|
||||
test()
|
||||
{
|
||||
int ia[] = {0};
|
||||
|
@ -209,6 +213,8 @@ test()
|
|||
assert(ig[3] == 0);
|
||||
assert(ig[4] == 1);
|
||||
assert(ig[5] == 2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#if TEST_STD_VER >= 11
|
||||
|
@ -435,5 +441,12 @@ int main(int, char**)
|
|||
|
||||
#endif
|
||||
|
||||
#if TEST_STD_VER > 17
|
||||
static_assert(test<forward_iterator<int*> >());
|
||||
static_assert(test<bidirectional_iterator<int*> >());
|
||||
static_assert(test<random_access_iterator<int*> >());
|
||||
static_assert(test<int*>());
|
||||
#endif // TEST_STD_VER > 17
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -12,6 +12,10 @@
|
|||
// constexpr OutIter // constexpr after C++17
|
||||
// rotate_copy(InIter first, InIter middle, InIter last, OutIter result);
|
||||
|
||||
// Older compilers don't support std::is_constant_evaluated
|
||||
// UNSUPPORTED: clang-4, clang-5, clang-6, clang-7, clang-8
|
||||
// UNSUPPORTED: apple-clang-9, apple-clang-10
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
|
||||
|
|
|
@ -8,6 +8,10 @@
|
|||
//
|
||||
// REQUIRES: long_tests
|
||||
|
||||
// Older compilers don't support std::is_constant_evaluated
|
||||
// UNSUPPORTED: clang-4, clang-5, clang-6, clang-7, clang-8
|
||||
// UNSUPPORTED: apple-clang-9, apple-clang-10
|
||||
|
||||
// <algorithm>
|
||||
|
||||
// template<InputIterator InIter1, InputIterator InIter2, typename OutIter>
|
||||
|
|
|
@ -8,6 +8,10 @@
|
|||
//
|
||||
// REQUIRES: long_tests
|
||||
|
||||
// Older compilers don't support std::is_constant_evaluated
|
||||
// UNSUPPORTED: clang-4, clang-5, clang-6, clang-7, clang-8
|
||||
// UNSUPPORTED: apple-clang-9, apple-clang-10
|
||||
|
||||
// <algorithm>
|
||||
|
||||
// template<InputIterator InIter1, InputIterator InIter2, typename OutIter,
|
||||
|
|
|
@ -261,7 +261,8 @@
|
|||
|
||||
<p>The missing bits in P0600 are in [mem.res.class], [mem.poly.allocator.class], and [container.node.overview]</p>
|
||||
|
||||
<p>The missing bits in P0202 are in <tt>copy</tt>, <tt>copy_backwards</tt>, <tt>move</tt>, and <tt>move_backwards</tt> (and the ones that call them: <tt>copy_n</tt>, <tt>rotate_copy</tt>, <tt>merge</tt>, <tt>set_union</tt>, <tt>set_difference</tt>, and <tt>set_symmetric_difference</tt>). This is because the first four algorithms have specializations that call <tt>memmove</tt> which is not constexpr. See <a href="https://bugs.llvm.org/show_bug.cgi?id=25165">Bug 25165</a></p>
|
||||
<p>The missing bits in P0202 are in <tt>copy</tt> and <tt>copy_backwards</tt> (and the ones that call them: <tt>copy_n</tt>, <tt>set_union</tt>, <tt>set_difference</tt>, and <tt>set_symmetric_difference</tt>). This is because the first two algorithms have specializations that call <tt>memmove</tt> which is not constexpr. See <a href="https://bugs.llvm.org/show_bug.cgi?id=25165">Bug 25165</a></p>
|
||||
|
||||
|
||||
<h3>Library Working group Issues Status</h3>
|
||||
<!-- <I>Note: "NAD" means that the issue was deemed "Not a defect"</I> -->
|
||||
|
|
Loading…
Reference in New Issue