diff --git a/libcxx/include/__config b/libcxx/include/__config index d215fdd078a6b2..dcb134bdaad23a 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -94,6 +94,9 @@ # define _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION // Enable optimized version of __do_get_(un)signed which avoids redundant copies. # define _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET +// Give reverse_iterator one data member of type T, not two. +// Also, in C++17 and later, don't derive iterator types from std::iterator. +# define _LIBCPP_ABI_NO_ITERATOR_BASES // Use the smallest possible integer type to represent the index of the variant. // Previously libc++ used "unsigned int" exclusively. # define _LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION diff --git a/libcxx/include/__memory/raw_storage_iterator.h b/libcxx/include/__memory/raw_storage_iterator.h index 8eed85311b88fa..b43000b1794869 100644 --- a/libcxx/include/__memory/raw_storage_iterator.h +++ b/libcxx/include/__memory/raw_storage_iterator.h @@ -27,17 +27,23 @@ _LIBCPP_BEGIN_NAMESPACE_STD #if _LIBCPP_STD_VER <= 17 || defined(_LIBCPP_ENABLE_CXX20_REMOVED_RAW_STORAGE_ITERATOR) +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 raw_storage_iterator - : public iterator&> // purposefully not C++03 +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator +#endif { +_LIBCPP_SUPPRESS_DEPRECATED_POP private: _OutputIterator __x_; public: + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; + _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) diff --git a/libcxx/include/iterator b/libcxx/include/iterator index 8dbcc9d0f355c1..e290a4922a2949 100644 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -93,7 +93,7 @@ template template -struct iterator +struct iterator // deprecated in C++17 { typedef T value_type; typedef Distance difference_type; @@ -137,7 +137,7 @@ namespace ranges { template class reverse_iterator - : public iterator::iterator_category, + : public iterator::iterator_category, // until C++17 typename iterator_traits::value_type, typename iterator_traits::difference_type, typename iterator_traits::pointer, @@ -343,7 +343,7 @@ constexpr move_iterator make_move_iterator(const Iterator& i); template , class Distance = ptrdiff_t> class istream_iterator - : public iterator + : public iterator // until C++17 { public: typedef charT char_type; @@ -370,7 +370,7 @@ bool operator!=(const istream_iterator& x, template > class ostream_iterator - : public iterator + : public iterator // until C++17 { public: typedef charT char_type; @@ -390,7 +390,7 @@ public: template > class istreambuf_iterator - : public iterator { @@ -423,7 +423,7 @@ bool operator!=(const istreambuf_iterator& a, template > class ostreambuf_iterator - : public iterator + : public iterator // until C++17 { public: typedef charT char_type; @@ -509,7 +509,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD template -struct _LIBCPP_TEMPLATE_VIS iterator +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 iterator { typedef _Tp value_type; typedef _Distance difference_type; @@ -628,16 +628,22 @@ template struct __is_stashing_iterator<_Tp, typename __void_t::type> : true_type {}; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class _LIBCPP_TEMPLATE_VIS reverse_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) : 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 { +_LIBCPP_SUPPRESS_DEPRECATED_POP private: - /*mutable*/ _Iter __t; // no longer used as of LWG #2360, not removed due to ABI break +#ifndef _LIBCPP_ABI_NO_ITERATOR_BASES + _Iter __t; // no longer used as of LWG #2360, not removed due to ABI break +#endif static_assert(!__is_stashing_iterator<_Iter>::value, "The specified iterator type cannot be used with reverse_iterator; " @@ -653,12 +659,15 @@ public: typedef _If<__is_cpp17_random_access_iterator<_Iter>::value, random_access_iterator_tag, typename iterator_traits<_Iter>::iterator_category> iterator_category; + typedef typename iterator_traits<_Iter>::value_type value_type; + #if _LIBCPP_STD_VER > 17 typedef _If<__is_cpp17_random_access_iterator<_Iter>::value, random_access_iterator_tag, bidirectional_iterator_tag> iterator_concept; #endif +#ifndef _LIBCPP_ABI_NO_ITERATOR_BASES _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator() : __t(), current() {} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 @@ -670,6 +679,19 @@ public: _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 reverse_iterator& operator=(const reverse_iterator<_Up>& __u) { __t = current = __u.base(); return *this; } +#else + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator() : current() {} + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + explicit reverse_iterator(_Iter __x) : current(__x) {} + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator(const reverse_iterator<_Up>& __u) : current(__u.base()) {} + template + _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 + reverse_iterator& operator=(const reverse_iterator<_Up>& __u) + { current = __u.base(); return *this; } +#endif _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 _Iter base() const {return current;} _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 @@ -780,17 +802,22 @@ reverse_iterator<_Iter> make_reverse_iterator(_Iter __i) } #endif +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class _LIBCPP_TEMPLATE_VIS back_insert_iterator - : public iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator +#endif { +_LIBCPP_SUPPRESS_DEPRECATED_POP protected: _Container* container; public: + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; typedef _Container container_type; _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 explicit back_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {} @@ -813,17 +840,22 @@ back_inserter(_Container& __x) return back_insert_iterator<_Container>(__x); } +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class _LIBCPP_TEMPLATE_VIS front_insert_iterator - : public iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator +#endif { +_LIBCPP_SUPPRESS_DEPRECATED_POP protected: _Container* container; public: + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; typedef _Container container_type; _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 explicit front_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {} @@ -846,18 +878,23 @@ front_inserter(_Container& __x) return front_insert_iterator<_Container>(__x); } +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class _LIBCPP_TEMPLATE_VIS insert_iterator - : public iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) + : public iterator +#endif { +_LIBCPP_SUPPRESS_DEPRECATED_POP protected: _Container* container; typename _Container::iterator iter; public: + typedef output_iterator_tag iterator_category; + typedef void value_type; + typedef void difference_type; + typedef void pointer; + typedef void reference; typedef _Container container_type; _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 insert_iterator(_Container& __x, typename _Container::iterator __i) @@ -881,12 +918,21 @@ inserter(_Container& __x, typename _Container::iterator __i) return insert_iterator<_Container>(__x, __i); } +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template , class _Distance = ptrdiff_t> class _LIBCPP_TEMPLATE_VIS istream_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) : public iterator +#endif { +_LIBCPP_SUPPRESS_DEPRECATED_POP public: + typedef input_iterator_tag iterator_category; + typedef _Tp value_type; + typedef _Distance difference_type; + typedef const _Tp* pointer; + typedef const _Tp& reference; typedef _CharT char_type; typedef _Traits traits_type; typedef basic_istream<_CharT,_Traits> istream_type; @@ -943,10 +989,14 @@ operator!=(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x, return !(__x == __y); } +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template > class _LIBCPP_TEMPLATE_VIS ostream_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) : public iterator +#endif { +_LIBCPP_SUPPRESS_DEPRECATED_POP public: typedef output_iterator_tag iterator_category; typedef void value_type; @@ -982,13 +1032,22 @@ public: _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++(int) {return *this;} }; +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class _LIBCPP_TEMPLATE_VIS istreambuf_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) : public iterator +#endif { +_LIBCPP_SUPPRESS_DEPRECATED_POP public: + typedef input_iterator_tag iterator_category; + typedef _CharT value_type; + typedef typename _Traits::off_type difference_type; + typedef _CharT* pointer; + typedef _CharT reference; typedef _CharT char_type; typedef _Traits traits_type; typedef typename _Traits::int_type int_type; @@ -1052,10 +1111,14 @@ bool operator!=(const istreambuf_iterator<_CharT,_Traits>& __a, const istreambuf_iterator<_CharT,_Traits>& __b) {return !__a.equal(__b);} +_LIBCPP_SUPPRESS_DEPRECATED_PUSH template class _LIBCPP_TEMPLATE_VIS ostreambuf_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) : public iterator +#endif { +_LIBCPP_SUPPRESS_DEPRECATED_POP public: typedef output_iterator_tag iterator_category; typedef void value_type; diff --git a/libcxx/include/memory b/libcxx/include/memory index 5d53ea5448181d..7c3c92c2015d78 100644 --- a/libcxx/include/memory +++ b/libcxx/include/memory @@ -154,11 +154,7 @@ bool operator!=(const allocator&, const allocator&) noexcept; // constexpr template class raw_storage_iterator - : public iterator // purposefully not C++03 + : public iterator // until C++17 { public: explicit raw_storage_iterator(OutputIterator x); 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 index 1fbba0263cdad1..17ac69b65561f4 100644 --- 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 @@ -24,26 +24,41 @@ #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 std::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 { +struct std::iterator_traits { // empty non-default. }; -} // namespace std int main(int, char**) { // If the qualified-id ITER_TRAITS(I)::iterator_concept is valid and names a type, diff --git a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_traits.compile.pass.cpp b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_traits.compile.pass.cpp new file mode 100644 index 00000000000000..50047c1b90513a --- /dev/null +++ b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_traits.compile.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// 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 + +// ITER_TRAITS(I) + +// For a type I, let ITER_TRAITS(I) denote the type I if iterator_traits names +// a specialization generated from the primary template. Otherwise, +// ITER_TRAITS(I) denotes iterator_traits. + +#include +#include + +#include "test_iterators.h" + +struct A : random_access_iterator {}; +struct B : random_access_iterator {}; +struct C : random_access_iterator {}; +struct D : random_access_iterator {}; +template<> struct std::iterator_traits {}; +template<> struct std::iterator_traits : std::iterator_traits {}; +template<> struct std::iterator_traits : std::iterator_traits {}; + +static_assert(std::is_same, std::iterator_traits>::value, ""); +static_assert(std::is_same, A>::value, ""); +static_assert(std::is_same, std::iterator_traits>::value, ""); +static_assert(std::is_same, std::iterator_traits>::value, ""); +static_assert(std::is_same, std::iterator_traits>::value, ""); 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 deleted file mode 100644 index 1d72bb7fb60740..00000000000000 --- a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/cpp20_iter_traits.pass.cpp +++ /dev/null @@ -1,47 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// 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 - -// ITER_TRAITS(I) - -// For a type I, let ITER_TRAITS(I) denote the type I if iterator_traits names -// a specialization generated from the primary template. Otherwise, -// ITER_TRAITS(I) denotes iterator_traits. - -#include "test_macros.h" - -#include - -struct MyIter : std::iterator {}; -struct MyIter2 : std::iterator {}; -struct MyIter3 : std::iterator {}; - -namespace std { -template <> -struct iterator_traits - : iterator_traits > {}; -template <> -struct iterator_traits - : std::iterator {}; - -} // namespace std - -int main(int, char**) { - ASSERT_SAME_TYPE(std::_ITER_TRAITS, std::iterator_traits); - { - using ClassIter = std::reverse_iterator; - ASSERT_SAME_TYPE(std::_ITER_TRAITS, ClassIter); - ASSERT_SAME_TYPE(std::_ITER_TRAITS, MyIter3); - } - { - ASSERT_SAME_TYPE(std::_ITER_TRAITS, std::iterator_traits); - ASSERT_SAME_TYPE(std::_ITER_TRAITS, std::iterator_traits); - } - return 0; -} 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 index 00000000000000..097801d0271984 --- /dev/null +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.basic/deprecated.verify.cpp @@ -0,0 +1,15 @@ +//===----------------------------------------------------------------------===// +// +// 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-re {{'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 index 49abf67692f664..c04f15e60b925b 100644 --- a/libcxx/test/std/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp +++ b/libcxx/test/std/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp @@ -19,6 +19,8 @@ // typedef Category iterator_category; // }; +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + #include #include 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 index e1cc4974c66f11..baf2383d9f62e2 100644 --- 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 @@ -52,6 +52,11 @@ test() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); + +#if TEST_STD_VER <= 14 + typedef std::iterator iterator_base; + static_assert((std::is_base_of::value), ""); +#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 index 97139ae2acbedf..4d122538b4cd03 100644 --- 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 @@ -53,6 +53,11 @@ test() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); + +#if TEST_STD_VER <= 14 + typedef std::iterator iterator_base; + static_assert((std::is_base_of::value), ""); +#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 index 1e199b3051b31d..d33079229cc66d 100644 --- 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 @@ -56,6 +56,11 @@ test() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); + +#if TEST_STD_VER <= 14 + typedef std::iterator iterator_base; + static_assert((std::is_base_of::value), ""); +#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 index 0406bc23efc9f9..939cf87a5d464f 100644 --- 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 @@ -49,6 +49,11 @@ test() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::pointer>::value), ""); + +#if TEST_STD_VER <= 14 + typedef std::iterator iterator_base; + 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 index aa00a0d53b1009..2018be6c7d07e2 100644 --- 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,9 +10,7 @@ // template , // class Distance = ptrdiff_t> -// class istream_iterator -// : public iterator -// { +// class istream_iterator { // public: // typedef charT char_type; // typedef traits traits_type; @@ -40,41 +38,41 @@ int main(int, char**) { + { typedef std::istream_iterator I1; // double is trivially destructible #if TEST_STD_VER <= 14 - static_assert((std::is_convertible >::value), ""); -#else + typedef std::iterator iterator_base; + 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::value), ""); static_assert((std::is_same::value), ""); 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), ""); static_assert( std::is_trivially_copy_constructible::value, ""); static_assert( std::is_trivially_destructible::value, ""); + } + { typedef std::istream_iterator I2; // unsigned is trivially destructible #if TEST_STD_VER <= 14 - static_assert((std::is_convertible >::value), ""); -#else + typedef std::iterator iterator_base; + 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::value), ""); static_assert((std::is_same::value), ""); 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), ""); static_assert( std::is_trivially_copy_constructible::value, ""); static_assert( std::is_trivially_destructible::value, ""); + } typedef std::istream_iterator I3; // string is NOT trivially destructible static_assert(!std::is_trivially_copy_constructible::value, ""); diff --git a/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_proxy/proxy.pass.cpp b/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_proxy/proxy.pass.cpp index 62e7acf01156eb..f385a4027ff4ec 100644 --- a/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_proxy/proxy.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_proxy/proxy.pass.cpp @@ -9,11 +9,7 @@ // // template > -// class istreambuf_iterator -// : public iterator -// { +// class istreambuf_iterator { // public: // ... // proxy operator++(int); 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 index c2f323b03a6eb8..d9cd65ad7f9499 100644 --- 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,11 +9,7 @@ // // template > -// class istreambuf_iterator -// : public iterator -// { +// class istreambuf_iterator { // public: // typedef charT char_type; // typedef traits traits_type; @@ -33,7 +29,12 @@ int main(int, char**) { + { typedef std::istreambuf_iterator I1; +#if TEST_STD_VER <= 14 + typedef std::iterator::off_type, char*, char> iterator_base; + 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), ""); @@ -47,8 +48,14 @@ int main(int, char**) static_assert((std::is_nothrow_default_constructible::value), "" ); static_assert((std::is_trivially_copy_constructible::value), "" ); static_assert((std::is_trivially_destructible::value), "" ); + } + { typedef std::istreambuf_iterator I2; +#if TEST_STD_VER <= 14 + typedef std::iterator::off_type, wchar_t*, wchar_t> iterator_base; + 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), ""); @@ -62,6 +69,7 @@ int main(int, char**) static_assert((std::is_nothrow_default_constructible::value), "" ); static_assert((std::is_trivially_copy_constructible::value), "" ); static_assert((std::is_trivially_destructible::value), "" ); + } 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 index 739e39d62b78f6..b5ac8199e52080 100644 --- 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,9 +10,7 @@ // template , // class Distance = ptrdiff_t> -// class ostream_iterator -// : public iterator -// { +// class ostream_iterator { // public: // typedef charT char_type; // typedef traits traits_type; @@ -27,11 +25,12 @@ int main(int, char**) { + { typedef std::ostream_iterator I1; #if TEST_STD_VER <= 14 - static_assert((std::is_convertible >::value), ""); -#else + typedef std::iterator iterator_base; + static_assert((std::is_base_of::value), ""); +#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); #if TEST_STD_VER <= 17 @@ -41,15 +40,17 @@ int main(int, char**) #endif static_assert((std::is_same::value), ""); 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), ""); + } + + { typedef std::ostream_iterator I2; #if TEST_STD_VER <= 14 - static_assert((std::is_convertible >::value), ""); -#else + typedef std::iterator iterator_base; + static_assert((std::is_base_of::value), ""); +#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); #if TEST_STD_VER <= 17 @@ -59,10 +60,10 @@ int main(int, char**) #endif static_assert((std::is_same::value), ""); 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), ""); + } 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 index 2a4e6ffa5e6b64..4d3925f2e52851 100644 --- 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,9 +9,7 @@ // // template > -// class ostreambuf_iterator -// : public iterator -// { +// class ostreambuf_iterator { // public: // typedef charT char_type; // typedef traits traits_type; @@ -28,11 +26,12 @@ int main(int, char**) { + { typedef std::ostreambuf_iterator I1; #if TEST_STD_VER <= 14 - static_assert((std::is_convertible >::value), ""); -#else + typedef std::iterator iterator_base; + static_assert((std::is_base_of::value), ""); +#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); #if TEST_STD_VER <= 17 @@ -42,17 +41,18 @@ int main(int, char**) #endif static_assert((std::is_same::value), ""); 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), ""); static_assert((std::is_same::value), ""); + } + { typedef std::ostreambuf_iterator I2; #if TEST_STD_VER <= 14 - static_assert((std::is_convertible >::value), ""); -#else + typedef std::iterator iterator_base; + static_assert((std::is_base_of::value), ""); +#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); #if TEST_STD_VER <= 17 @@ -62,11 +62,11 @@ int main(int, char**) #endif static_assert((std::is_same::value), ""); 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), ""); static_assert((std::is_same::value), ""); + } return 0; } 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 new file mode 100644 index 00000000000000..734e8d9937ef8c --- /dev/null +++ b/libcxx/test/std/utilities/memory/storage.iterator/types.compile.pass.cpp @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_CXX20_REMOVED_RAW_STORAGE_ITERATOR +// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS + +// raw_storage_iterator associated types + +#include +#include + +struct T; +typedef T* OutputIt; +typedef std::raw_storage_iterator It; + +static_assert(std::is_same::value, ""); +static_assert(std::is_same::value, ""); +static_assert(std::is_same::value, ""); +static_assert(std::is_same::value, ""); +static_assert(std::is_same::value, "");