libstdc++: Add a move-only testsuite iterator type

This adds a move-only testsuite iterator wrapper to <testsuite_iterators.h>
which will be used in the tests for LWG 3355.  The tests for LWG 3389 and 3390
are adjusted to use this new iterator wrapper.

libstdc++-v3/ChangeLog:

	* testsuite/util/testsuite_iterators.h (input_iterator_wrapper_nocopy):
	New testsuite iterator.
	* testsuite/24_iterators/counted_iterator/lwg3389.cc: Use it.
	* testsuite/24_iterators/move_iterator/lwg3390.cc: Likewise.
This commit is contained in:
Patrick Palka 2020-03-02 16:21:33 -05:00
parent 05779e2c89
commit d6d4b339f5
4 changed files with 37 additions and 66 deletions

View File

@ -1,5 +1,10 @@
2020-03-04 Patrick Palka <ppalka@redhat.com>
* testsuite/util/testsuite_iterators.h (input_iterator_wrapper_nocopy):
New testsuite iterator.
* testsuite/24_iterators/counted_iterator/lwg3389.cc: use it.
* testsuite/24_iterators/move_iterator/lwg3390.cc: Likewise.
* include/bits/ranges_uninitialized.h
(uninitialized_copy_fn::operator()): Pass a reference type as the first
argument to is_nothrow_assignable_v.

View File

@ -23,44 +23,13 @@
#include <testsuite_iterators.h>
using __gnu_test::test_range;
using __gnu_test::input_iterator_wrapper;
template<typename T>
struct move_only_wrapper : input_iterator_wrapper<T>
{
using input_iterator_wrapper<T>::input_iterator_wrapper;
move_only_wrapper()
: input_iterator_wrapper<T>(nullptr, nullptr)
{ }
move_only_wrapper(const move_only_wrapper&) = delete;
move_only_wrapper&
operator=(const move_only_wrapper&) = delete;
move_only_wrapper(move_only_wrapper&&) = default;
move_only_wrapper&
operator=(move_only_wrapper&&) = default;
using input_iterator_wrapper<T>::operator++;
move_only_wrapper&
operator++()
{
input_iterator_wrapper<T>::operator++();
return *this;
}
};
static_assert(std::input_iterator<move_only_wrapper<int>>);
static_assert(!std::forward_iterator<move_only_wrapper<int>>);
static_assert(!std::copyable<move_only_wrapper<int>>);
using __gnu_test::input_iterator_wrapper_nocopy;
// LWG 3389
void
test01()
{
int x[] = {1,2,3,4};
test_range<int, move_only_wrapper> rx(x);
test_range<int, input_iterator_wrapper_nocopy> rx(x);
auto it = std::counted_iterator(rx.begin(), 2);
}

View File

@ -23,44 +23,13 @@
#include <testsuite_iterators.h>
using __gnu_test::test_range;
using __gnu_test::input_iterator_wrapper;
template<typename T>
struct move_only_wrapper : input_iterator_wrapper<T>
{
using input_iterator_wrapper<T>::input_iterator_wrapper;
move_only_wrapper()
: input_iterator_wrapper<T>(nullptr, nullptr)
{ }
move_only_wrapper(const move_only_wrapper&) = delete;
move_only_wrapper&
operator=(const move_only_wrapper&) = delete;
move_only_wrapper(move_only_wrapper&&) = default;
move_only_wrapper&
operator=(move_only_wrapper&&) = default;
using input_iterator_wrapper<T>::operator++;
move_only_wrapper&
operator++()
{
input_iterator_wrapper<T>::operator++();
return *this;
}
};
static_assert(std::input_iterator<move_only_wrapper<int>>);
static_assert(!std::forward_iterator<move_only_wrapper<int>>);
static_assert(!std::copyable<move_only_wrapper<int>>);
using __gnu_test::input_iterator_wrapper_nocopy;
// LWG 3390
void
test01()
{
int x[] = {1,2,3,4};
test_range<int, move_only_wrapper> rx(x);
test_range<int, input_iterator_wrapper_nocopy> rx(x);
auto it = std::make_move_iterator(rx.begin());
}

View File

@ -674,6 +674,34 @@ namespace __gnu_test
{ return iter -= n; }
};
// A move-only input iterator type.
template<typename T>
struct input_iterator_wrapper_nocopy : input_iterator_wrapper<T>
{
using input_iterator_wrapper<T>::input_iterator_wrapper;
input_iterator_wrapper_nocopy()
: input_iterator_wrapper<T>(nullptr, nullptr)
{ }
input_iterator_wrapper_nocopy(const input_iterator_wrapper_nocopy&) = delete;
input_iterator_wrapper_nocopy&
operator=(const input_iterator_wrapper_nocopy&) = delete;
input_iterator_wrapper_nocopy(input_iterator_wrapper_nocopy&&) = default;
input_iterator_wrapper_nocopy&
operator=(input_iterator_wrapper_nocopy&&) = default;
using input_iterator_wrapper<T>::operator++;
input_iterator_wrapper_nocopy&
operator++()
{
input_iterator_wrapper<T>::operator++();
return *this;
}
};
// A type meeting the minimum std::range requirements
template<typename T, template<typename> class Iter>
class test_range