diff --git a/libcxx/include/__config b/libcxx/include/__config --- 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 --- a/libcxx/include/__memory/raw_storage_iterator.h +++ b/libcxx/include/__memory/raw_storage_iterator.h @@ -29,15 +29,21 @@ 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) +_LIBCPP_SUPPRESS_DEPRECATED_PUSH + : public iterator +_LIBCPP_SUPPRESS_DEPRECATED_POP +#endif { 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 --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -93,7 +93,7 @@ template -struct iterator +struct iterator // deprecated in C++17 { typedef T value_type; typedef Distance difference_type; @@ -507,7 +507,7 @@ template -struct _LIBCPP_TEMPLATE_VIS iterator +struct _LIBCPP_TEMPLATE_VIS _LIBCPP_DEPRECATED_IN_CXX17 iterator { typedef _Tp value_type; typedef _Distance difference_type; @@ -628,14 +628,20 @@ template class _LIBCPP_TEMPLATE_VIS reverse_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) +_LIBCPP_SUPPRESS_DEPRECATED_PUSH : 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> +_LIBCPP_SUPPRESS_DEPRECATED_POP +#endif { 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; " @@ -651,12 +657,15 @@ 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 @@ -668,6 +677,19 @@ _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,15 +802,20 @@ template class _LIBCPP_TEMPLATE_VIS back_insert_iterator - : public iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) +_LIBCPP_SUPPRESS_DEPRECATED_PUSH + : public iterator +_LIBCPP_SUPPRESS_DEPRECATED_POP +#endif { 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,15 +840,20 @@ template class _LIBCPP_TEMPLATE_VIS front_insert_iterator - : public iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) +_LIBCPP_SUPPRESS_DEPRECATED_PUSH + : public iterator +_LIBCPP_SUPPRESS_DEPRECATED_POP +#endif { 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,16 +878,21 @@ template class _LIBCPP_TEMPLATE_VIS insert_iterator - : public iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) +_LIBCPP_SUPPRESS_DEPRECATED_PUSH + : public iterator +_LIBCPP_SUPPRESS_DEPRECATED_POP +#endif { 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) @@ -882,9 +919,18 @@ template , class _Distance = ptrdiff_t> class _LIBCPP_TEMPLATE_VIS istream_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) +_LIBCPP_SUPPRESS_DEPRECATED_PUSH : public iterator +_LIBCPP_SUPPRESS_DEPRECATED_POP +#endif { 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,7 +989,11 @@ template > class _LIBCPP_TEMPLATE_VIS ostream_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) +_LIBCPP_SUPPRESS_DEPRECATED_PUSH : public iterator +_LIBCPP_SUPPRESS_DEPRECATED_POP +#endif { public: typedef output_iterator_tag iterator_category; @@ -982,11 +1032,20 @@ template class _LIBCPP_TEMPLATE_VIS istreambuf_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) +_LIBCPP_SUPPRESS_DEPRECATED_PUSH : public iterator +_LIBCPP_SUPPRESS_DEPRECATED_POP +#endif { 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,7 +1111,11 @@ template class _LIBCPP_TEMPLATE_VIS ostreambuf_iterator +#if _LIBCPP_STD_VER <= 14 || !defined(_LIBCPP_ABI_NO_ITERATOR_BASES) +_LIBCPP_SUPPRESS_DEPRECATED_PUSH : public iterator +_LIBCPP_SUPPRESS_DEPRECATED_POP +#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 @@ -24,20 +24,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,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 --- 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: -Wno-deprecated-declarations + #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 --- 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 @@ -24,6 +24,8 @@ // typedef void pointer; // }; +// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated-declarations + #include #include #include @@ -52,6 +54,11 @@ 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 --- 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 @@ -25,6 +25,8 @@ // typedef output_iterator_tag iterator_category; // }; +// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated-declarations + #include #include #include @@ -53,6 +55,11 @@ 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 --- 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 @@ -25,6 +25,8 @@ // typedef void pointer; // }; +// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated-declarations + #include #include #include @@ -56,6 +58,11 @@ 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 --- 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 @@ -24,6 +24,8 @@ // typename iterator_traits::reference> { // }; +// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated-declarations + #include #include @@ -49,6 +51,11 @@ 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 --- a/libcxx/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp @@ -32,6 +32,8 @@ // destructor is a trivial destructor. // Testing the C++17 ctors for this are in the ctor tests. +// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated-declarations + #include #include #include @@ -40,41 +42,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/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 @@ -25,6 +25,8 @@ // All specializations of istreambuf_iterator shall have a trivial copy constructor, // a constexpr default constructor and a trivial destructor. +// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated-declarations + #include #include #include @@ -33,7 +35,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 +54,14 @@ 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 +75,7 @@ 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 --- a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/types.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/ostream.iterator/types.pass.cpp @@ -19,6 +19,8 @@ // typedef basic_istream istream_type; // ... +// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated-declarations + #include #include #include @@ -27,11 +29,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 +44,17 @@ #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 +64,10 @@ #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 --- a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp +++ b/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp @@ -19,6 +19,8 @@ // typedef basic_ostream ostream_type; // ... +// ADDITIONAL_COMPILE_FLAGS: -Wno-deprecated-declarations + #include #include #include @@ -28,11 +30,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 +45,18 @@ #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 +66,11 @@ #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; }