From d5a559d906b52101fe2aa8b08704e4ef0d6d651b Mon Sep 17 00:00:00 2001 From: Nikolas Klauser Date: Mon, 4 Jul 2022 22:43:50 +0200 Subject: [PATCH] [libc++] default-construct moved-from test-iterators This way we ensure that we don't use-after-move the iterators. Reviewed By: Mordante, #libc Spies: libcxx-commits Differential Revision: https://reviews.llvm.org/D129044 --- libcxx/test/support/test_iterators.h | 40 ++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/libcxx/test/support/test_iterators.h b/libcxx/test/support/test_iterators.h index 6d3a8e2..c4cecc4 100644 --- a/libcxx/test/support/test_iterators.h +++ b/libcxx/test/support/test_iterators.h @@ -33,8 +33,12 @@ public: typedef typename std::iterator_traits::reference reference; TEST_CONSTEXPR explicit cpp17_output_iterator(It it) : it_(std::move(it)) {} + template - TEST_CONSTEXPR cpp17_output_iterator(const cpp17_output_iterator& u) :it_(u.it_) {} + TEST_CONSTEXPR cpp17_output_iterator(const cpp17_output_iterator& u) : it_(u.it_) {} + + template ::value>::type> + TEST_CONSTEXPR_CXX14 cpp17_output_iterator(cpp17_output_iterator&& u) : it_(u.it_) { u.it_ = U(); } TEST_CONSTEXPR reference operator*() const {return *it_;} @@ -67,8 +71,12 @@ public: typedef typename Traits::reference reference; TEST_CONSTEXPR explicit cpp17_input_iterator(It it) : it_(it) {} + template - TEST_CONSTEXPR cpp17_input_iterator(const cpp17_input_iterator& u) : it_(u.it_) {} + TEST_CONSTEXPR cpp17_input_iterator(const cpp17_input_iterator& u) : it_(u.it_) {} + + template ::value>::type> + TEST_CONSTEXPR_CXX14 cpp17_input_iterator(cpp17_input_iterator&& u) : it_(u.it_) { u.it_ = U(); } TEST_CONSTEXPR reference operator*() const {return *it_;} @@ -102,8 +110,12 @@ public: TEST_CONSTEXPR forward_iterator() : it_() {} TEST_CONSTEXPR explicit forward_iterator(It it) : it_(it) {} + template - TEST_CONSTEXPR forward_iterator(const forward_iterator& u) : it_(u.it_) {} + TEST_CONSTEXPR forward_iterator(const forward_iterator& u) : it_(u.it_) {} + + template ::value>::type> + TEST_CONSTEXPR_CXX14 forward_iterator(forward_iterator&& other) : it_(other.it_) { other.it_ = U(); } TEST_CONSTEXPR reference operator*() const {return *it_;} @@ -134,8 +146,12 @@ public: TEST_CONSTEXPR bidirectional_iterator() : it_() {} TEST_CONSTEXPR explicit bidirectional_iterator(It it) : it_(it) {} + template - TEST_CONSTEXPR bidirectional_iterator(const bidirectional_iterator& u) : it_(u.it_) {} + TEST_CONSTEXPR bidirectional_iterator(const bidirectional_iterator& u) : it_(u.it_) {} + + template ::value>::type> + TEST_CONSTEXPR_CXX14 bidirectional_iterator(bidirectional_iterator&& u) : it_(u.it_) { u.it_ = U(); } TEST_CONSTEXPR reference operator*() const {return *it_;} @@ -168,8 +184,12 @@ public: TEST_CONSTEXPR random_access_iterator() : it_() {} TEST_CONSTEXPR explicit random_access_iterator(It it) : it_(it) {} + template - TEST_CONSTEXPR random_access_iterator(const random_access_iterator& u) : it_(u.it_) {} + TEST_CONSTEXPR random_access_iterator(const random_access_iterator& u) : it_(u.it_) {} + + template ::value>::type> + TEST_CONSTEXPR_CXX14 random_access_iterator(random_access_iterator&& u) : it_(u.it_) { u.it_ = U(); } TEST_CONSTEXPR_CXX14 reference operator*() const {return *it_;} TEST_CONSTEXPR_CXX14 reference operator[](difference_type n) const {return it_[n];} @@ -220,8 +240,12 @@ public: TEST_CONSTEXPR_CXX14 contiguous_iterator() : it_() {} TEST_CONSTEXPR_CXX14 explicit contiguous_iterator(It it) : it_(it) {} + template - TEST_CONSTEXPR_CXX14 contiguous_iterator(const contiguous_iterator& u) : it_(u.it_) {} + TEST_CONSTEXPR_CXX14 contiguous_iterator(const contiguous_iterator& u) : it_(u.it_) {} + + template ::value>::type> + constexpr contiguous_iterator(contiguous_iterator&& u) : it_(u.it_) { u.it_ = U(); } TEST_CONSTEXPR reference operator*() const {return *it_;} TEST_CONSTEXPR pointer operator->() const {return it_;} @@ -272,9 +296,13 @@ public: constexpr three_way_contiguous_iterator() : it_() {} constexpr explicit three_way_contiguous_iterator(It it) : it_(it) {} + template constexpr three_way_contiguous_iterator(const three_way_contiguous_iterator& u) : it_(u.it_) {} + template ::value>::type> + constexpr three_way_contiguous_iterator(three_way_contiguous_iterator&& u) : it_(u.it_) { u.it_ = U(); } + constexpr reference operator*() const {return *it_;} constexpr pointer operator->() const {return it_;} constexpr reference operator[](difference_type n) const {return it_[n];} -- 2.7.4