diff --git a/libcxx/include/__memory/raw_storage_iterator.h b/libcxx/include/__memory/raw_storage_iterator.h --- a/libcxx/include/__memory/raw_storage_iterator.h +++ b/libcxx/include/__memory/raw_storage_iterator.h @@ -40,7 +40,11 @@ public: typedef output_iterator_tag iterator_category; typedef void value_type; +#if _LIBCPP_STD_VER > 17 + typedef ptrdiff_t difference_type; +#else typedef void difference_type; +#endif typedef void pointer; typedef void reference; diff --git a/libcxx/include/iterator b/libcxx/include/iterator --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -242,16 +242,19 @@ template class back_insert_iterator + : public iterator // until C++17 { protected: Container* container; public: typedef Container container_type; typedef void value_type; - typedef void difference_type; + typedef void difference_type; // until C++20 + typedef ptrdiff_t difference_type; // since C++20 typedef void reference; typedef void pointer; + constexpr back_insert_iterator() noexcept = default; // since C++20 explicit back_insert_iterator(Container& x); // constexpr in C++20 back_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 back_insert_iterator& operator*(); // constexpr in C++20 @@ -263,16 +266,19 @@ template class front_insert_iterator + : public iterator // until C++17 { protected: Container* container; public: typedef Container container_type; typedef void value_type; - typedef void difference_type; + typedef void difference_type; // until C++20 + typedef ptrdiff_t difference_type; // since C++20 typedef void reference; typedef void pointer; + constexpr front_insert_iterator() noexcept = default; // since C++20 explicit front_insert_iterator(Container& x); // constexpr in C++20 front_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 front_insert_iterator& operator*(); // constexpr in C++20 @@ -284,6 +290,7 @@ template class insert_iterator + : public iterator // until C++17 { protected: Container* container; @@ -291,10 +298,12 @@ public: typedef Container container_type; typedef void value_type; - typedef void difference_type; + typedef void difference_type; // until C++20 + typedef ptrdiff_t difference_type; // since C++20 typedef void reference; typedef void pointer; + insert_iterator() = default; // since C++20 insert_iterator(Container& x, typename Container::iterator i); // constexpr in C++20 insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 insert_iterator& operator*(); // constexpr in C++20 @@ -380,9 +389,15 @@ : public iterator // until C++17 { public: - typedef charT char_type; - typedef traits traits_type; - typedef basic_istream istream_type; + typedef input_iterator_tag iterator_category; + typedef T value_type; + typedef Distance difference_type; + typedef const T* pointer; + typedef const T& reference; + + typedef charT char_type; + typedef traits traits_type; + typedef basic_istream istream_type; constexpr istream_iterator(); istream_iterator(istream_type& s); @@ -404,13 +419,21 @@ template > class ostream_iterator - : public iterator // until C++17 + : public iterator // until C++17 { public: + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; // until C++20 + typedef ptrdiff_t difference_type; // since C++20 + typedef void pointer; + typedef void reference; + typedef charT char_type; typedef traits traits_type; typedef basic_ostream ostream_type; + constexpr ostream_iterator() noexcept = default; // since C++20 ostream_iterator(ostream_type& s); ostream_iterator(ostream_type& s, const charT* delimiter); ostream_iterator(const ostream_iterator& x); @@ -424,16 +447,20 @@ template > class istreambuf_iterator - : public iterator + : public iterator // until C++17 { public: - typedef charT char_type; - typedef traits traits_type; - typedef typename traits::int_type int_type; - typedef basic_streambuf streambuf_type; - typedef basic_istream istream_type; + typedef input_iterator_tag iterator_category; + typedef charT value_type; + typedef traits::off_type difference_type; + typedef unspecified pointer; + typedef charT reference; + + typedef charT char_type; + typedef traits traits_type; + typedef traits::int_type int_type; + typedef basic_streambuf streambuf_type; + typedef basic_istream istream_type; istreambuf_iterator() noexcept; istreambuf_iterator(istream_type& s) noexcept; @@ -460,11 +487,19 @@ : public iterator // until C++17 { public: - typedef charT char_type; - typedef traits traits_type; - typedef basic_streambuf streambuf_type; - typedef basic_ostream ostream_type; - + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; // until C++20 + typedef ptrdiff_t difference_type; // since C++20 + typedef void pointer; + typedef void reference; + + typedef charT char_type; + typedef traits traits_type; + typedef basic_streambuf streambuf_type; + typedef basic_ostream ostream_type; + + constexpr ostreambuf_iterator() noexcept = default; // since C++20 ostreambuf_iterator(ostream_type& s) noexcept; ostreambuf_iterator(streambuf_type* s) noexcept; ostreambuf_iterator& operator=(charT c); @@ -851,11 +886,18 @@ public: typedef output_iterator_tag iterator_category; typedef void value_type; +#if _LIBCPP_STD_VER > 17 + typedef ptrdiff_t difference_type; +#else typedef void difference_type; +#endif typedef void pointer; typedef void reference; typedef _Container container_type; +#if _LIBCPP_STD_VER > 17 + _LIBCPP_INLINE_VISIBILITY constexpr back_insert_iterator() noexcept = default; +#endif _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 explicit back_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 back_insert_iterator& operator=(const typename _Container::value_type& __value_) {container->push_back(__value_); return *this;} @@ -889,11 +931,18 @@ public: typedef output_iterator_tag iterator_category; typedef void value_type; +#if _LIBCPP_STD_VER > 17 + typedef ptrdiff_t difference_type; +#else typedef void difference_type; +#endif typedef void pointer; typedef void reference; typedef _Container container_type; +#if _LIBCPP_STD_VER > 17 + _LIBCPP_INLINE_VISIBILITY constexpr front_insert_iterator() noexcept = default; +#endif _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 explicit front_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 front_insert_iterator& operator=(const typename _Container::value_type& __value_) {container->push_front(__value_); return *this;} @@ -928,11 +977,18 @@ public: typedef output_iterator_tag iterator_category; typedef void value_type; +#if _LIBCPP_STD_VER > 17 + typedef ptrdiff_t difference_type; +#else typedef void difference_type; +#endif typedef void pointer; typedef void reference; typedef _Container container_type; +#if _LIBCPP_STD_VER > 17 + _LIBCPP_INLINE_VISIBILITY insert_iterator() = default; +#endif _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 insert_iterator(_Container& __x, typename _Container::iterator __i) : container(_VSTD::addressof(__x)), iter(__i) {} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 insert_iterator& operator=(const typename _Container::value_type& __value_) @@ -1037,7 +1093,7 @@ typedef output_iterator_tag iterator_category; typedef void value_type; #if _LIBCPP_STD_VER > 17 - typedef std::ptrdiff_t difference_type; + typedef ptrdiff_t difference_type; #else typedef void difference_type; #endif @@ -1051,6 +1107,9 @@ ostream_type* __out_stream_; const char_type* __delim_; public: +#if _LIBCPP_STD_VER > 17 + _LIBCPP_INLINE_VISIBILITY constexpr ostream_iterator() noexcept = default; +#endif _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s) _NOEXCEPT : __out_stream_(_VSTD::addressof(__s)), __delim_(nullptr) {} _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s, const _CharT* __delimiter) _NOEXCEPT @@ -1159,7 +1218,7 @@ typedef output_iterator_tag iterator_category; typedef void value_type; #if _LIBCPP_STD_VER > 17 - typedef std::ptrdiff_t difference_type; + typedef ptrdiff_t difference_type; #else typedef void difference_type; #endif @@ -1173,6 +1232,9 @@ private: streambuf_type* __sbuf_; public: +#if _LIBCPP_STD_VER > 17 + _LIBCPP_INLINE_VISIBILITY constexpr ostreambuf_iterator() noexcept = default; +#endif _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(ostream_type& __s) _NOEXCEPT : __sbuf_(__s.rdbuf()) {} _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(streambuf_type* __s) _NOEXCEPT diff --git a/libcxx/include/memory b/libcxx/include/memory --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -153,10 +153,17 @@ bool operator!=(const allocator&, const allocator&) noexcept; // constexpr in C++20 template -class raw_storage_iterator +class raw_storage_iterator // deprecated in C++17, removed in C++20 : public iterator // until C++17 { public: + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; // until C++20 + typedef ptrdiff_t difference_type; // since C++20 + typedef void pointer; + typedef void reference; + explicit raw_storage_iterator(OutputIterator x); raw_storage_iterator& operator*(); raw_storage_iterator& operator=(const T& element); diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/cxx20_iterator_traits.compile.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/cxx20_iterator_traits.compile.pass.cpp --- a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/cxx20_iterator_traits.compile.pass.cpp +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/cxx20_iterator_traits.compile.pass.cpp @@ -50,12 +50,12 @@ typename Traits::iterator_concept; }; -template +template constexpr bool testIOIterator() { using Traits = std::iterator_traits; 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); static_assert(!has_iterator_concept_v); @@ -200,8 +200,8 @@ #if !defined(_LIBCPP_HAS_NO_LOCALIZATION) static_assert(testWithoutConcept, char, long long, char, char*, std::input_iterator_tag>()); static_assert(testWithoutConcept, int, std::ptrdiff_t, int&&, int*, std::random_access_iterator_tag>()); -static_assert(testIOIterator, std::output_iterator_tag, std::ptrdiff_t>()); -static_assert(testIOIterator, std::output_iterator_tag, std::ptrdiff_t>()); +static_assert(testIOIterator, std::output_iterator_tag>()); +static_assert(testIOIterator, std::output_iterator_tag>()); static_assert(testConstWithoutConcept()); static_assert(testConstWithoutConcept()); #endif // !_LIBCPP_HAS_NO_LOCALIZATION diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/default.pass.cpp copy from libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp copy to libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/default.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/default.pass.cpp @@ -7,19 +7,32 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 -// UNSUPPORTED: libcpp-no-concepts -// UNSUPPORTED: gcc-10 -// insert_iterator +// -#include +// class back_insert_iterator + +// constexpr back_insert_iterator() noexcept = default; +#include #include -using iterator = std::insert_iterator >; -static_assert(!std::indirectly_readable); -static_assert(std::indirectly_writable); -static_assert(!std::weakly_incrementable); -static_assert(!std::input_or_output_iterator); -static_assert(!std::sentinel_for); -static_assert(!std::input_iterator); +#include "test_macros.h" + +struct T { }; +using Container = std::vector; + +constexpr bool test() { + std::back_insert_iterator it; + (void)it; + return true; +} + +int main(int, char**) { + ASSERT_NOEXCEPT(std::back_insert_iterator()); + + test(); + static_assert(test()); + + return 0; +} diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/iterator_concept_conformance.compile.pass.cpp @@ -19,8 +19,8 @@ using iterator = std::back_insert_iterator >; static_assert(!std::indirectly_readable); static_assert(std::indirectly_writable); -static_assert(!std::weakly_incrementable); -static_assert(!std::input_or_output_iterator); +static_assert(std::weakly_incrementable); +static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::input_iterator); diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/types.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/types.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/types.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iterator/types.pass.cpp @@ -13,13 +13,16 @@ // Test nested types and data member: // template -// class back_insert_iterator { +// class back_insert_iterator +// : public iterator // until C++17 +// { // protected: // Cont* container; // public: // typedef Cont container_type; // typedef void value_type; -// typedef void difference_type; +// typedef void difference_type; // until C++20 +// typedef ptrdiff_t difference_type; // since C++20 // typedef void reference; // typedef void pointer; // }; @@ -48,7 +51,11 @@ q.test(); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); +#if TEST_STD_VER > 17 + static_assert((std::is_same::value), ""); +#else static_assert((std::is_same::value), ""); +#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/default.pass.cpp copy from libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp copy to libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/default.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/default.pass.cpp @@ -7,19 +7,32 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 -// UNSUPPORTED: libcpp-no-concepts -// UNSUPPORTED: gcc-10 -// insert_iterator +// -#include +// class front_insert_iterator + +// constexpr front_insert_iterator() noexcept = default; +#include #include -using iterator = std::insert_iterator >; -static_assert(!std::indirectly_readable); -static_assert(std::indirectly_writable); -static_assert(!std::weakly_incrementable); -static_assert(!std::input_or_output_iterator); -static_assert(!std::sentinel_for); -static_assert(!std::input_iterator); +#include "test_macros.h" + +struct T { }; +using Container = std::vector; + +constexpr bool test() { + std::front_insert_iterator it; + (void)it; + return true; +} + +int main(int, char**) { + ASSERT_NOEXCEPT(std::front_insert_iterator()); + + test(); + static_assert(test()); + + return 0; +} diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/iterator_concept_conformance.compile.pass.cpp @@ -19,8 +19,8 @@ using iterator = std::front_insert_iterator >; static_assert(!std::indirectly_readable); static_assert(std::indirectly_writable); -static_assert(!std::weakly_incrementable); -static_assert(!std::input_or_output_iterator); +static_assert(std::weakly_incrementable); +static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::input_iterator); diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/types.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/types.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/types.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iterator/types.pass.cpp @@ -13,13 +13,16 @@ // Test nested types and data member: // template -// class front_insert_iterator { +// class front_insert_iterator +// : public iterator // until C++17 +// { // protected: // Container* container; // public: // typedef Container container_type; // typedef void value_type; -// typedef void difference_type; +// typedef void difference_type; // until C++20 +// typedef ptrdiff_t difference_type; // since C++20 // typedef void reference; // typedef void pointer; // typedef output_iterator_tag iterator_category; @@ -49,7 +52,11 @@ q.test(); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); +#if TEST_STD_VER > 17 + static_assert((std::is_same::value), ""); +#else static_assert((std::is_same::value), ""); +#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/default.pass.cpp copy from libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp copy to libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/default.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/default.pass.cpp @@ -7,19 +7,20 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 -// UNSUPPORTED: libcpp-no-concepts -// UNSUPPORTED: gcc-10 -// insert_iterator +// -#include +// class insert_iterator + +// insert_iterator() = default; +#include #include -using iterator = std::insert_iterator >; -static_assert(!std::indirectly_readable); -static_assert(std::indirectly_writable); -static_assert(!std::weakly_incrementable); -static_assert(!std::input_or_output_iterator); -static_assert(!std::sentinel_for); -static_assert(!std::input_iterator); +struct T { }; +using Container = std::vector; + +int main(int, char**) { + std::insert_iterator it; (void)it; + return 0; +} diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/iterator_concept_conformance.compile.pass.cpp @@ -19,7 +19,7 @@ using iterator = std::insert_iterator >; static_assert(!std::indirectly_readable); static_assert(std::indirectly_writable); -static_assert(!std::weakly_incrementable); -static_assert(!std::input_or_output_iterator); +static_assert(std::weakly_incrementable); +static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::input_iterator); diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/types.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/types.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/types.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iterator/types.pass.cpp @@ -13,14 +13,17 @@ // Test nested types and data members: // template -// class insert_iterator { +// class insert_iterator +// : public iterator // until C++17 +// { // protected: // Cont* container; // Cont::iterator iter; // public: // typedef Cont container_type; // typedef void value_type; -// typedef void difference_type; +// typedef void difference_type; // until C++20 +// typedef ptrdiff_t difference_type; // since C++20 // typedef void reference; // typedef void pointer; // }; @@ -52,7 +55,11 @@ q.test(); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); +#if TEST_STD_VER > 17 + static_assert((std::is_same::value), ""); +#else static_assert((std::is_same::value), ""); +#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); diff --git a/libcxx/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp b/libcxx/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp @@ -10,11 +10,20 @@ // template , // class Distance = ptrdiff_t> -// class istream_iterator { +// class istream_iterator +// : public iterator // until C++17 +// { // public: -// typedef charT char_type; -// typedef traits traits_type; -// typedef basic_istream istream_type; +// typedef input_iterator_tag iterator_category; +// typedef T value_type; +// typedef Distance difference_type; +// typedef const T* pointer; +// typedef const T& reference; +// +// typedef basic_istream istream_type; +// typedef charT char_type; +// typedef traits traits_type; +// typedef basic_istream istream_type; // ... // // Before C++17, we have: diff --git a/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp b/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp @@ -9,13 +9,21 @@ // // template > -// class istreambuf_iterator { +// class istreambuf_iterator +// : public iterator // until C++17 +// { // public: -// typedef charT char_type; -// typedef traits traits_type; -// typedef typename traits::int_type int_type; -// typedef basic_streambuf streambuf_type; -// typedef basic_istream istream_type; +// typedef input_iterator_tag iterator_category; +// typedef charT value_type; +// typedef traits::off_type difference_type; +// typedef unspecified pointer; +// typedef charT reference; +// +// typedef charT char_type; +// typedef traits traits_type; +// typedef traits::int_type int_type; +// typedef basic_streambuf streambuf_type; +// typedef basic_istream istream_type; // ... // // All specializations of istreambuf_iterator shall have a trivial copy constructor, diff --git a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/iterator_concept_conformance.compile.pass.cpp @@ -19,8 +19,8 @@ using iterator = std::ostream_iterator; static_assert(!std::indirectly_readable); static_assert(std::indirectly_writable); -static_assert(!std::weakly_incrementable); -static_assert(!std::input_or_output_iterator); +static_assert(std::weakly_incrementable); +static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::input_iterator); diff --git a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/default.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/default.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/default.pass.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 + +// + +// class ostream_iterator + +// constexpr ostream_iterator() noexcept = default; + +#include +#include // char_traits + +#include "test_macros.h" + +struct MyTraits : std::char_traits { + MyTraits(); // This should not be called. +}; + +constexpr bool test() { + std::ostream_iterator it; + (void)it; + std::ostream_iterator wit; + (void)wit; + return true; +} + +int main(int, char**) { + ASSERT_NOEXCEPT(std::ostream_iterator()); + ASSERT_NOEXCEPT(std::ostream_iterator()); + + test(); + static_assert(test()); + + return 0; +} diff --git a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/types.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/types.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/types.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/types.pass.cpp @@ -10,11 +10,20 @@ // template , // class Distance = ptrdiff_t> -// class ostream_iterator { +// class ostream_iterator +// : public iterator // until C++17 +// { // public: -// typedef charT char_type; -// typedef traits traits_type; -// typedef basic_istream istream_type; +// typedef output_iterator_tag iterator_category; +// typedef void value_type; +// typedef void difference_type; // until C++20 +// typedef ptrdiff_t difference_type; // since C++20 +// typedef void pointer; +// typedef void reference; +// +// typedef charT char_type; +// typedef traits traits_type; +// typedef basic_ostream ostream_type; // ... #include diff --git a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/iterator_concept_conformance.compile.pass.cpp @@ -20,8 +20,8 @@ using iterator = std::ostreambuf_iterator; static_assert(!std::indirectly_readable); static_assert(std::indirectly_writable); -static_assert(!std::weakly_incrementable); -static_assert(!std::input_or_output_iterator); +static_assert(std::weakly_incrementable); +static_assert(std::input_or_output_iterator); static_assert(!std::sentinel_for); static_assert(!std::sized_sentinel_for); static_assert(!std::input_iterator); diff --git a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/default.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/default.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/default.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++03, c++11, c++14, c++17 + +// + +// class ostreambuf_iterator + +// constexpr ostreambuf_iterator() noexcept = default; + +#include + +#include "test_macros.h" + +constexpr bool test() { + std::ostreambuf_iterator it; + (void)it; + std::ostreambuf_iterator wit; + (void)wit; + return true; +} + +int main(int, char**) { + ASSERT_NOEXCEPT(std::ostreambuf_iterator()); + ASSERT_NOEXCEPT(std::ostreambuf_iterator()); + + test(); + static_assert(test()); + + return 0; +} diff --git a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp --- a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp @@ -9,13 +9,22 @@ // // template > -// class ostreambuf_iterator { +// class ostreambuf_iterator +// : public iterator // until C++17 +// { // public: -// typedef charT char_type; -// typedef traits traits_type; -// typedef basic_streambuf streambuf_type; -// typedef basic_ostream ostream_type; -// ... +// typedef output_iterator_tag iterator_category; +// typedef void value_type; +// typedef void difference_type; // until C++20 +// typedef ptrdiff_t difference_type; // since C++20 +// typedef void pointer; +// typedef void reference; +// +// typedef charT char_type; +// typedef traits traits_type; +// typedef basic_streambuf streambuf_type; +// typedef basic_ostream ostream_type; +// ... #include #include diff --git a/libcxx/test/std/utilities/memory/storage.iterator/types.compile.pass.cpp b/libcxx/test/std/utilities/memory/storage.iterator/types.compile.pass.cpp --- a/libcxx/test/std/utilities/memory/storage.iterator/types.compile.pass.cpp +++ b/libcxx/test/std/utilities/memory/storage.iterator/types.compile.pass.cpp @@ -11,15 +11,22 @@ // raw_storage_iterator associated types +#include #include #include +#include "test_macros.h" + struct T; typedef T* OutputIt; typedef std::raw_storage_iterator It; static_assert(std::is_same::value, ""); static_assert(std::is_same::value, ""); +#if TEST_STD_VER > 17 +static_assert(std::is_same::value, ""); +#else static_assert(std::is_same::value, ""); +#endif static_assert(std::is_same::value, ""); static_assert(std::is_same::value, "");