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 @@ -27,19 +27,31 @@ template class _LIBCPP_TEMPLATE_VIS raw_storage_iterator +#if _LIBCPP_STD_VER <= 14 : public iterator&> // purposefully not C++03 +#endif { private: _OutputIterator __x_; public: - _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} - _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() {return *this;} - _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) - {::new ((void*)_VSTD::addressof(*__x_)) _Tp(__element); return *this;} +#if _LIBCPP_STD_VER > 14 + using iterator_category = output_iterator_tag; + using value_type = void; + using difference_type = void; + using pointer = void; + using reference = void; +#endif + + _LIBCPP_INLINE_VISIBILITY explicit raw_storage_iterator(_OutputIterator __x) : __x_(__x) {} + _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator*() { return *this; } + _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(const _Tp& __element) { + ::new ((void*)_VSTD::addressof(*__x_)) _Tp(__element); + return *this; + } #if _LIBCPP_STD_VER >= 14 _LIBCPP_INLINE_VISIBILITY raw_storage_iterator& operator=(_Tp&& __element) {::new ((void*)_VSTD::addressof(*__x_)) _Tp(_VSTD::move(__element)); return *this;} diff --git a/libcxx/include/iterator b/libcxx/include/iterator --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -81,7 +81,8 @@ template -struct iterator +struct iterator // until C++17 +struct [[deprecated)]] iterator // since C++17 { typedef T value_type; typedef Distance difference_type; @@ -483,7 +484,7 @@ template -struct _LIBCPP_TEMPLATE_VIS iterator +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 iterator { typedef _Tp value_type; typedef _Distance difference_type; @@ -603,11 +604,13 @@ template class _LIBCPP_TEMPLATE_VIS reverse_iterator +#if _LIBCPP_STD_VER <= 14 : public iterator::iterator_category, typename iterator_traits<_Iter>::value_type, typename iterator_traits<_Iter>::difference_type, typename iterator_traits<_Iter>::pointer, typename iterator_traits<_Iter>::reference> +#endif { private: /*mutable*/ _Iter __t; // no longer used as of LWG #2360, not removed due to ABI break @@ -620,12 +623,15 @@ _Iter current; public: typedef _Iter iterator_type; - typedef typename iterator_traits<_Iter>::difference_type difference_type; - typedef typename iterator_traits<_Iter>::reference reference; - typedef typename iterator_traits<_Iter>::pointer pointer; typedef _If<__is_cpp17_random_access_iterator<_Iter>::value, random_access_iterator_tag, typename iterator_traits<_Iter>::iterator_category> iterator_category; +#if _LIBCPP_STD_VER > 14 + typedef typename iterator_traits<_Iter>::value_type value_type; +#endif + typedef typename iterator_traits<_Iter>::difference_type difference_type; + typedef typename iterator_traits<_Iter>::pointer pointer; + typedef typename iterator_traits<_Iter>::reference reference; #if _LIBCPP_STD_VER > 17 typedef _If<__is_cpp17_random_access_iterator<_Iter>::value, random_access_iterator_tag, @@ -755,15 +761,24 @@ template class _LIBCPP_TEMPLATE_VIS back_insert_iterator +#if _LIBCPP_STD_VER <= 14 : public iterator +#endif { protected: _Container* container; public: +#if _LIBCPP_STD_VER > 14 + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; +#endif typedef _Container container_type; _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 explicit back_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {} @@ -788,15 +803,24 @@ template class _LIBCPP_TEMPLATE_VIS front_insert_iterator +#if _LIBCPP_STD_VER <= 14 : public iterator +#endif { protected: _Container* container; public: +#if _LIBCPP_STD_VER > 14 + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; +#endif typedef _Container container_type; _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 explicit front_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {} @@ -821,16 +845,25 @@ template class _LIBCPP_TEMPLATE_VIS insert_iterator +#if _LIBCPP_STD_VER <= 14 : public iterator +#endif { protected: _Container* container; typename _Container::iterator iter; public: +#if _LIBCPP_STD_VER > 14 + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; +#endif typedef _Container container_type; _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 insert_iterator(_Container& __x, typename _Container::iterator __i) @@ -857,9 +890,18 @@ template , class _Distance = ptrdiff_t> class _LIBCPP_TEMPLATE_VIS istream_iterator +#if _LIBCPP_STD_VER <= 14 : public iterator +#endif { public: +#if _LIBCPP_STD_VER > 14 + typedef input_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef const _Tp* pointer; + typedef const _Tp& reference; +#endif typedef _CharT char_type; typedef _Traits traits_type; typedef basic_istream<_CharT,_Traits> istream_type; @@ -918,7 +960,9 @@ template > class _LIBCPP_TEMPLATE_VIS ostream_iterator +#if _LIBCPP_STD_VER <= 14 : public iterator +#endif { public: typedef output_iterator_tag iterator_category; @@ -957,11 +1001,20 @@ template class _LIBCPP_TEMPLATE_VIS istreambuf_iterator +#if _LIBCPP_STD_VER <= 14 : public iterator +#endif { public: +#if _LIBCPP_STD_VER > 14 + typedef input_iterator_tag iterator_category; + typedef _CharT value_type; + typedef typename _Traits::off_type difference_type; + typedef _CharT* pointer; + typedef _CharT reference; +#endif typedef _CharT char_type; typedef _Traits traits_type; typedef typename _Traits::int_type int_type; @@ -1027,7 +1080,9 @@ template class _LIBCPP_TEMPLATE_VIS ostreambuf_iterator +#if _LIBCPP_STD_VER <= 14 : public iterator +#endif { public: typedef output_iterator_tag iterator_category; diff --git a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_concepts.pass.cpp b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_concepts.pass.cpp --- a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_concepts.pass.cpp +++ b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_concepts.pass.cpp @@ -8,6 +8,9 @@ // UNSUPPORTED: c++03 +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + // ITER_TRAITS(I) // -- If the qualified-id ITER_TRAITS(I)::iterator_concept is valid and names a @@ -24,20 +27,37 @@ #include struct OtherTag : std::input_iterator_tag {}; struct OtherTagTwo : std::output_iterator_tag {}; -struct MyIter : std::iterator { + +struct MyIter { + using iterator_category = std::random_access_iterator_tag; using iterator_concept = int; + using value_type = char; + using difference_type = std::ptrdiff_t; + using pointer = char*; + using reference = char&; }; -struct MyIter2 : std::iterator { +struct MyIter2 { + using iterator_category = OtherTag; + using value_type = char; + using difference_type = std::ptrdiff_t; + using pointer = char*; + using reference = char&; }; + struct MyIter3 {}; struct Empty {}; struct EmptyWithSpecial {}; namespace std { template <> -struct iterator_traits - : std::iterator {}; +struct iterator_traits { + using iterator_category = OtherTagTwo; + using value_type = char; + using difference_type = std::ptrdiff_t; + using pointer = char*; + using reference = char&; +}; template <> struct iterator_traits { diff --git a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_traits.pass.cpp b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_traits.pass.cpp --- a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_traits.pass.cpp +++ b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_traits.pass.cpp @@ -18,17 +18,48 @@ #include -struct MyIter : std::iterator {}; -struct MyIter2 : std::iterator {}; -struct MyIter3 : std::iterator {}; +struct MyIter { + using iterator_category = std::random_access_iterator_tag; + using value_type = char; + using difference_type = std::ptrdiff_t; + using pointer = char*; + using reference = char&; +}; + +struct MyIter2 { + using iterator_category = std::random_access_iterator_tag; + using value_type = char; + using difference_type = std::ptrdiff_t; + using pointer = char*; + using reference = char&; +}; + +struct MyIter3 { + using iterator_category = std::random_access_iterator_tag; + using value_type = char; + using difference_type = std::ptrdiff_t; + using pointer = char*; + using reference = char&; +}; namespace std { template <> -struct iterator_traits - : iterator_traits > {}; +struct iterator_traits { + using iterator_category = std::random_access_iterator_tag; + using value_type = char; + using difference_type = std::ptrdiff_t; + using pointer = char*; + using reference = char&; +}; + template <> -struct iterator_traits - : std::iterator {}; +struct iterator_traits { + using iterator_category = std::random_access_iterator_tag; + using value_type = char; + using difference_type = std::ptrdiff_t; + using pointer = char*; + using reference = char&; +}; } // namespace std diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.basic/deprecated.verify.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.basic/deprecated.verify.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.basic/deprecated.verify.cpp @@ -0,0 +1,16 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +// std::iterator + +#include + +std::iterator it; +// expected-warning@-1{{'iterator' is deprecated}} diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp --- a/libcxx/test/std/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp @@ -6,6 +6,9 @@ // //===----------------------------------------------------------------------===// +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + // // template struct find_container : private std::back_insert_iterator @@ -52,6 +55,13 @@ static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); + + using iterator_base = std::iterator; +#if TEST_STD_VER <= 14 + static_assert(std::is_base_of::value, ""); +#else + static_assert(!std::is_base_of_v); +#endif } int main(int, char**) 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 @@ -31,6 +31,9 @@ #include "test_macros.h" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + template struct find_container : private std::front_insert_iterator @@ -53,6 +56,13 @@ static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); + + using iterator_base = std::iterator; +#if TEST_STD_VER <= 14 + static_assert(std::is_base_of::value, ""); +#else + static_assert(!std::is_base_of_v); +#endif } int main(int, char**) 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 @@ -30,6 +30,9 @@ #include #include "test_macros.h" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + template struct find_members : private std::insert_iterator @@ -56,6 +59,13 @@ static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); + + using iterator_base = std::iterator; +#if TEST_STD_VER <= 14 + static_assert(std::is_base_of::value, ""); +#else + static_assert(!std::is_base_of_v); +#endif } int main(int, char**) diff --git a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp --- a/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp +++ b/libcxx/test/std/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp @@ -30,6 +30,9 @@ #include "test_macros.h" #include "test_iterators.h" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + template struct find_current : private std::reverse_iterator @@ -49,6 +52,13 @@ static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::pointer>::value), ""); + + using iterator_base = std::iterator; +#if TEST_STD_VER <= 14 + static_assert(std::is_base_of::value, ""); +#else + static_assert(!std::is_base_of::value); +#endif #if TEST_STD_VER > 17 if constexpr (std::is_same_v) { 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 @@ -38,14 +38,18 @@ #include "test_macros.h" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + int main(int, char**) { typedef std::istream_iterator I1; // double is trivially destructible + using iterator_base = std::iterator; #if TEST_STD_VER <= 14 - static_assert((std::is_convertible >::value), ""); + static_assert((std::is_convertible::value), ""); + static_assert(std::is_base_of >::value, ""); #else + static_assert(!std::is_base_of >::value, ""); 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/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 @@ -31,9 +31,18 @@ #include "test_macros.h" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + int main(int, char**) { typedef std::istreambuf_iterator I1; + using iterator_base = std::iterator::off_type, char*, char>; +#if TEST_STD_VER <= 14 + static_assert(std::is_base_of::value, ""); +#else + static_assert(!std::is_base_of::value, ""); +#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::off_type>::value), ""); 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 @@ -25,13 +25,18 @@ #include "test_macros.h" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + int main(int, char**) { typedef std::ostream_iterator I1; + using iterator_base = std::iterator; #if TEST_STD_VER <= 14 - static_assert((std::is_convertible >::value), ""); + static_assert(std::is_base_of::value, ""); + static_assert((std::is_convertible::value), ""); #else + static_assert(!std::is_base_of::value, ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); #if TEST_STD_VER <= 17 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 @@ -26,13 +26,18 @@ #include "test_macros.h" +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + int main(int, char**) { typedef std::ostreambuf_iterator I1; + using iterator_base = std::iterator; #if TEST_STD_VER <= 14 - static_assert((std::is_convertible >::value), ""); + static_assert(std::is_base_of::value, ""); + static_assert((std::is_convertible::value), ""); #else + static_assert(!std::is_base_of::value, ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); #if TEST_STD_VER <= 17