diff --git a/libcxx/test/std/iterators/predef.iterators/iterators.common/arrow.pass.cpp b/libcxx/test/std/iterators/predef.iterators/iterators.common/arrow.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/iterators.common/arrow.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/iterators.common/arrow.pass.cpp @@ -14,71 +14,79 @@ #include #include +#include +#include "test_iterators.h" #include "test_macros.h" #include "types.h" void test() { - int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8}; - - // Case 2: http://eel.is/c++draft/iterators.common#common.iter.access-5.2 - { - auto iter1 = simple_iterator(buffer); - auto commonIter1 = std::common_iterator>(iter1); - const auto commonIter2 = std::common_iterator>(iter1); - - assert(commonIter1.operator->() == buffer); - assert(commonIter2.operator->() == buffer); - } - - // Case 3: http://eel.is/c++draft/iterators.common#common.iter.access-5.3 - { - auto iter1 = value_iterator(buffer); - auto commonIter1 = std::common_iterator>(iter1); - const auto commonIter2 = std::common_iterator>(iter1); - - assert(*commonIter1.operator->().operator->() == 1); - assert(*commonIter2.operator->().operator->() == 1); - } - - // Case 3: http://eel.is/c++draft/iterators.common#common.iter.access-5.3 - { - auto iter1 = void_plus_plus_iterator(buffer); - auto commonIter1 = std::common_iterator>(iter1); - const auto commonIter2 = std::common_iterator>(iter1); - - assert(*commonIter1.operator->().operator->() == 1); - assert(*commonIter2.operator->().operator->() == 1); - } - // Case 1: http://eel.is/c++draft/iterators.common#common.iter.access-5.1 { - auto iter1 = cpp17_input_iterator(buffer); - auto commonIter1 = std::common_iterator>(iter1); - const auto commonIter2 = std::common_iterator>(iter1); - - assert(base(commonIter1.operator->()) == buffer); - assert(base(commonIter2.operator->()) == buffer); + auto check = []() { + int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8}; + Iterator iter(buffer); + using Common = std::common_iterator>; + + Common common(iter); + std::same_as auto result = common.operator->(); + assert(base(result) == buffer); + + Common const ccommon(iter); + std::same_as auto cresult = ccommon.operator->(); + assert(base(cresult) == buffer); + }; + + check.operator()>(); + check.operator()(); } - // Case 1: http://eel.is/c++draft/iterators.common#common.iter.access-5.1 + // Case 2: http://eel.is/c++draft/iterators.common#common.iter.access-5.2 { - auto iter1 = forward_iterator(buffer); - auto commonIter1 = std::common_iterator>(iter1); - const auto commonIter2 = std::common_iterator>(iter1); - - assert(base(commonIter1.operator->()) == buffer); - assert(base(commonIter2.operator->()) == buffer); + auto check = []() { + int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8}; + Iterator iter(buffer); + using Common = std::common_iterator>; + + Common common(iter); + std::same_as auto result = common.operator->(); + assert(result == buffer); + + Common const ccommon(iter); + std::same_as auto cresult = ccommon.operator->(); + assert(cresult == buffer); + }; + + check.operator()>(); + check.operator()>(); + // cpp20_input_iterator can't be used with common_iterator because it's not copyable + check.operator()>(); + check.operator()>(); + check.operator()>(); } - // Case 1: http://eel.is/c++draft/iterators.common#common.iter.access-5.1 + // Case 3: http://eel.is/c++draft/iterators.common#common.iter.access-5.3 { - auto iter1 = random_access_iterator(buffer); - auto commonIter1 = std::common_iterator>(iter1); - const auto commonIter2 = std::common_iterator>(iter1); - - assert(base(commonIter1.operator->()) == buffer); - assert(base(commonIter2.operator->()) == buffer); + auto check = []() { + int buffer[8] = {1, 2, 3, 4, 5, 6, 7, 8}; + Iterator iter(buffer); + using Common = std::common_iterator>; + + Common common(iter); + auto proxy = common.operator->(); + std::same_as auto result = proxy.operator->(); + assert(result != buffer); // we copied to a temporary proxy + assert(*result == *buffer); + + Common const ccommon(iter); + auto cproxy = ccommon.operator->(); + std::same_as auto cresult = cproxy.operator->(); + assert(cresult != buffer); // we copied to a temporary proxy + assert(*cresult == *buffer); + }; + + check.operator()>(); + check.operator()>(); } } diff --git a/libcxx/test/std/iterators/predef.iterators/iterators.common/iterator_traits.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/iterators.common/iterator_traits.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/iterators.common/iterator_traits.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/iterators.common/iterator_traits.compile.pass.cpp @@ -91,7 +91,7 @@ static_assert(std::same_as); static_assert(std::same_as); static_assert(std::same_as); - static_assert(std::same_as); + static_assert(std::same_as); static_assert(std::same_as); } { @@ -103,7 +103,7 @@ static_assert(std::same_as); static_assert(std::same_as); static_assert(std::same_as); - static_assert(std::same_as); + static_assert(std::same_as); static_assert(std::same_as); } { @@ -115,7 +115,7 @@ static_assert(std::same_as); static_assert(std::same_as); static_assert(std::same_as); - static_assert(std::same_as); + static_assert(std::same_as); static_assert(std::same_as); } diff --git a/libcxx/test/support/test_iterators.h b/libcxx/test/support/test_iterators.h --- a/libcxx/test/support/test_iterators.h +++ b/libcxx/test/support/test_iterators.h @@ -71,7 +71,6 @@ TEST_CONSTEXPR cpp17_input_iterator(const cpp17_input_iterator& u) : it_(u.it_) {} TEST_CONSTEXPR reference operator*() const {return *it_;} - TEST_CONSTEXPR pointer operator->() const {return it_;} TEST_CONSTEXPR_CXX14 cpp17_input_iterator& operator++() {++it_; return *this;} TEST_CONSTEXPR_CXX14 cpp17_input_iterator operator++(int) {return cpp17_input_iterator(it_++);} @@ -107,7 +106,6 @@ TEST_CONSTEXPR forward_iterator(const forward_iterator& u) : it_(u.it_) {} TEST_CONSTEXPR reference operator*() const {return *it_;} - TEST_CONSTEXPR pointer operator->() const {return it_;} TEST_CONSTEXPR_CXX14 forward_iterator& operator++() {++it_; return *this;} TEST_CONSTEXPR_CXX14 forward_iterator operator++(int) {return forward_iterator(it_++);} @@ -140,7 +138,6 @@ TEST_CONSTEXPR bidirectional_iterator(const bidirectional_iterator& u) : it_(u.it_) {} TEST_CONSTEXPR reference operator*() const {return *it_;} - TEST_CONSTEXPR pointer operator->() const {return it_;} TEST_CONSTEXPR_CXX14 bidirectional_iterator& operator++() {++it_; return *this;} TEST_CONSTEXPR_CXX14 bidirectional_iterator& operator--() {--it_; return *this;} @@ -175,7 +172,6 @@ TEST_CONSTEXPR random_access_iterator(const random_access_iterator& u) : it_(u.it_) {} TEST_CONSTEXPR_CXX14 reference operator*() const {return *it_;} - TEST_CONSTEXPR_CXX14 pointer operator->() const {return it_;} TEST_CONSTEXPR_CXX14 reference operator[](difference_type n) const {return it_[n];} TEST_CONSTEXPR_CXX14 random_access_iterator& operator++() {++it_; return *this;}