diff --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp --- a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp +++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.output/output_iterator.compile.pass.cpp @@ -28,6 +28,15 @@ static_assert( std::output_iterator, DerivedFromT>); static_assert(!std::output_iterator, T>); +static_assert( std::output_iterator, int>); +static_assert( std::output_iterator, short>); +static_assert( std::output_iterator, long>); +static_assert( std::output_iterator, T>); +static_assert(!std::output_iterator, T>); +static_assert( std::output_iterator, T const>); +static_assert( std::output_iterator, DerivedFromT>); +static_assert(!std::output_iterator, T>); + // Not satisfied when the iterator is not an input_or_output_iterator static_assert(!std::output_iterator); static_assert(!std::output_iterator); 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 @@ -515,6 +515,32 @@ using type = std::iter_value_t; }; +template +class cpp20_output_iterator { + It it_; + +public: + using difference_type = std::iter_difference_t; + + constexpr explicit cpp20_output_iterator(It it) : it_(it) {} + cpp20_output_iterator(cpp20_output_iterator&&) = default; + cpp20_output_iterator& operator=(cpp20_output_iterator&&) = default; + + constexpr decltype(auto) operator*() const { return *it_; } + constexpr cpp20_output_iterator& operator++() { + ++it_; + return *this; + } + constexpr cpp20_output_iterator operator++(int) { return cpp20_output_iterator(it_++); } + + friend constexpr It base(const cpp20_output_iterator& i) { return i.it_; } + + template + void operator,(T const&) = delete; +}; + +static_assert(std::output_iterator, int>); + // Iterator adaptor that counts the number of times the iterator has had a successor/predecessor // operation called. Has two recorders: // * `stride_count`, which records the total number of calls to an op++, op--, op+=, or op-=.