diff --git a/libcxx/docs/Cxx2aStatusIssuesStatus.csv b/libcxx/docs/Cxx2aStatusIssuesStatus.csv --- a/libcxx/docs/Cxx2aStatusIssuesStatus.csv +++ b/libcxx/docs/Cxx2aStatusIssuesStatus.csv @@ -246,7 +246,7 @@ "`3323 <https://wg21.link/LWG3323>`__","``*has-tuple-element*``\ helper concept needs ``convertible_to``\ ","Prague","","" "`3324 <https://wg21.link/LWG3324>`__","Special-case ``std::strong/weak/partial_order``\ for pointers","Prague","","" "`3325 <https://wg21.link/LWG3325>`__","Constrain return type of transformation function for ``transform_view``\ ","Prague","","" -"`3326 <https://wg21.link/LWG3326>`__","``enable_view``\ has false positives","Prague","","" +"`3326 <https://wg21.link/LWG3326>`__","``enable_view``\ has false positives","Prague","|In progress|","" "`3327 <https://wg21.link/LWG3327>`__","Format alignment specifiers vs. text direction","Prague","|Nothing To Do|","" "`3328 <https://wg21.link/LWG3328>`__","Clarify that ``std::string``\ is not good for UTF-8","Prague","","" "`3329 <https://wg21.link/LWG3329>`__","``totally_ordered_with``\ both directly and indirectly requires ``common_reference_with``\ ","Prague","|Complete|","13.0" diff --git a/libcxx/docs/Cxx2aStatusPaperStatus.csv b/libcxx/docs/Cxx2aStatusPaperStatus.csv --- a/libcxx/docs/Cxx2aStatusPaperStatus.csv +++ b/libcxx/docs/Cxx2aStatusPaperStatus.csv @@ -193,3 +193,4 @@ "`P2102 <https://wg21.link/P2102>`__","LWG","Make 'implicit expression variations' more explicit (Wording for US185)","Prague","* *","" "`P2106 <https://wg21.link/P2106>`__","LWG","Alternative wording for GB315 and GB316","Prague","* *","" "`P2116 <https://wg21.link/P2116>`__","LWG","Remove tuple-like protocol support from fixed-extent span","Prague","|Complete|","11.0" +"`P2325 <https://wg21.link/P2325>`__","LWG","Views should not be required to be default constructible","June Telecon","|In progress|","" diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -50,8 +50,8 @@ __ranges/empty.h __ranges/empty_view.h __ranges/enable_borrowed_range.h + __ranges/enable_view.h __ranges/view_interface.h - __ranges/view.h __ranges/size.h __split_buffer __std_stream diff --git a/libcxx/include/__iterator/concepts.h b/libcxx/include/__iterator/concepts.h --- a/libcxx/include/__iterator/concepts.h +++ b/libcxx/include/__iterator/concepts.h @@ -71,7 +71,6 @@ template<class _Ip> concept weakly_incrementable = - default_initializable<_Ip> && movable<_Ip> && requires(_Ip __i) { typename iter_difference_t<_Ip>; diff --git a/libcxx/include/__ranges/concepts.h b/libcxx/include/__ranges/concepts.h --- a/libcxx/include/__ranges/concepts.h +++ b/libcxx/include/__ranges/concepts.h @@ -13,6 +13,7 @@ #include <__iterator/concepts.h> #include <__ranges/access.h> #include <__ranges/size.h> +#include <__ranges/enable_view.h> #include <type_traits> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -63,6 +64,23 @@ // `disable_sized_range` defined in `<__ranges/size.h>` + // [range.view], views + + // `enable_view` defined in <__ranges/enable_view.h> + // `view_base` defined in <__ranges/enable_view.h> + + template <class _Tp> + concept view = + range<_Tp> && + movable<_Tp> && + enable_view<_Tp>; + + template<class _Range> + concept __simple_view = + view<_Range> && range<const _Range> && + same_as<iterator_t<_Range>, iterator_t<const _Range> > && + same_as<sentinel_t<_Range>, iterator_t<const _Range> >; + // [range.refinements], other range refinements template <class _Tp> concept input_range = range<_Tp> && input_iterator<iterator_t<_Tp> >; diff --git a/libcxx/include/__ranges/view.h b/libcxx/include/__ranges/enable_view.h rename from libcxx/include/__ranges/view.h rename to libcxx/include/__ranges/enable_view.h --- a/libcxx/include/__ranges/view.h +++ b/libcxx/include/__ranges/enable_view.h @@ -7,14 +7,12 @@ // //===----------------------------------------------------------------------===// -#ifndef _LIBCPP___RANGES_VIEW_H -#define _LIBCPP___RANGES_VIEW_H +#ifndef _LIBCPP___RANGES_ENABLE_VIEW_H +#define _LIBCPP___RANGES_ENABLE_VIEW_H #include <__config> -#include <__ranges/concepts.h> #include <concepts> - #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header #endif @@ -28,23 +26,11 @@ namespace ranges { -struct view_base { }; +struct view_base {}; template <class _Tp> inline constexpr bool enable_view = derived_from<_Tp, view_base>; -template <class _Tp> -concept view = - range<_Tp> && - movable<_Tp> && - default_initializable<_Tp> && - enable_view<_Tp>; - -template<class _Range> -concept __simple_view = - view<_Range> && range<const _Range> && - same_as<iterator_t<_Range>, iterator_t<const _Range>> && - same_as<sentinel_t<_Range>, iterator_t<const _Range>>; } // end namespace ranges #endif // !_LIBCPP_HAS_NO_RANGES @@ -53,4 +39,4 @@ _LIBCPP_POP_MACROS -#endif // _LIBCPP___RANGES_VIEW_H +#endif // _LIBCPP___RANGES_ENABLE_VIEW_H diff --git a/libcxx/include/__ranges/view_interface.h b/libcxx/include/__ranges/view_interface.h --- a/libcxx/include/__ranges/view_interface.h +++ b/libcxx/include/__ranges/view_interface.h @@ -15,7 +15,7 @@ #include <__iterator/prev.h> #include <__ranges/access.h> #include <__ranges/empty.h> -#include <__ranges/view.h> +#include <__ranges/enable_view.h> #include <type_traits> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) diff --git a/libcxx/include/iterator b/libcxx/include/iterator --- a/libcxx/include/iterator +++ b/libcxx/include/iterator @@ -254,7 +254,6 @@ 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 @@ -278,7 +277,6 @@ 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 @@ -303,7 +301,6 @@ 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 @@ -436,7 +433,6 @@ typedef traits traits_type; typedef basic_ostream<charT,traits> 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); @@ -502,7 +498,6 @@ typedef basic_streambuf<charT, traits> streambuf_type; typedef basic_ostream<charT, traits> 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); @@ -849,9 +844,6 @@ 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;} @@ -894,9 +886,6 @@ 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;} @@ -927,7 +916,7 @@ _LIBCPP_SUPPRESS_DEPRECATED_POP protected: _Container* container; - typename _Container::iterator iter; + typename _Container::iterator iter; // FIXME: `ranges::iterator_t<Container>` in C++20 mode public: typedef output_iterator_tag iterator_category; typedef void value_type; @@ -940,9 +929,6 @@ 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_) @@ -1061,9 +1047,6 @@ 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 @@ -1186,9 +1169,6 @@ 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/ranges b/libcxx/include/ranges --- a/libcxx/include/ranges +++ b/libcxx/include/ranges @@ -99,9 +99,9 @@ #include <__ranges/empty.h> #include <__ranges/empty_view.h> #include <__ranges/enable_borrowed_range.h> +#include <__ranges/enable_view.h> #include <__ranges/size.h> #include <__ranges/view_interface.h> -#include <__ranges/view.h> #include <compare> // Required by the standard. #include <initializer_list> // Required by the standard. #include <iterator> // Required by the standard. diff --git a/libcxx/include/span b/libcxx/include/span --- a/libcxx/include/span +++ b/libcxx/include/span @@ -22,6 +22,9 @@ template <class ElementType, size_t Extent = dynamic_extent> class span; +template<class ElementType, size_t Extent> + inline constexpr bool ranges::enable_view<span<ElementType, Extent>> = true; + template<class ElementType, size_t Extent> inline constexpr bool ranges::enable_borrowed_range<span<ElementType, Extent>> = true; @@ -127,6 +130,7 @@ #include <__config> #include <__debug> #include <__ranges/enable_borrowed_range.h> +#include <__ranges/enable_view.h> #include <array> // for array #include <cstddef> // for byte #include <iterator> // for iterators @@ -531,6 +535,9 @@ #if !defined(_LIBCPP_HAS_NO_RANGES) template <class _Tp, size_t _Extent> inline constexpr bool ranges::enable_borrowed_range<span<_Tp, _Extent> > = true; + +template <class _ElementType, size_t _Extent> +inline constexpr bool ranges::enable_view<span<_ElementType, _Extent>> = true; #endif // !defined(_LIBCPP_HAS_NO_RANGES) // as_bytes & as_writable_bytes diff --git a/libcxx/include/string_view b/libcxx/include/string_view --- a/libcxx/include/string_view +++ b/libcxx/include/string_view @@ -19,6 +19,9 @@ template<class charT, class traits = char_traits<charT>> class basic_string_view; + template<class charT, class traits> + inline constexpr bool ranges::enable_view<basic_string_view<charT, traits>> = true; + template<class charT, class traits> inline constexpr bool ranges::enable_borrowed_range<basic_string_view<charT, traits>> = true; // C++20 @@ -184,6 +187,7 @@ #include <__config> #include <__debug> #include <__ranges/enable_borrowed_range.h> +#include <__ranges/enable_view.h> #include <__string> #include <algorithm> #include <compare> @@ -654,6 +658,9 @@ }; #if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_RANGES) +template<class _CharT, class _Traits> +inline constexpr bool ranges::enable_view<basic_string_view<_CharT, _Traits>> = true; + template <class _CharT, class _Traits> inline constexpr bool ranges::enable_borrowed_range<basic_string_view<_CharT, _Traits> > = true; #endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_RANGES) diff --git a/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp @@ -23,13 +23,13 @@ static_assert(std::same_as<stdr::iterator_t<range>, range::iterator>); static_assert(stdr::common_range<range>); static_assert(stdr::random_access_range<range>); -static_assert(!stdr::view<range>); +static_assert(stdr::view<range>&& stdr::enable_view<range>); static_assert(stdr::sized_range<range>); static_assert(stdr::borrowed_range<range>); static_assert(std::same_as<stdr::iterator_t<range const>, range::iterator>); static_assert(stdr::common_range<range const>); static_assert(stdr::random_access_range<range const>); -static_assert(!stdr::view<range const>); +static_assert(!stdr::view<range const> && !stdr::enable_view<range const>); static_assert(stdr::sized_range<range const>); static_assert(stdr::borrowed_range<range const>); diff --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/subsumption.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/subsumption.verify.cpp rename from libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/subsumption.compile.pass.cpp rename to libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/subsumption.verify.cpp --- a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/subsumption.compile.pass.cpp +++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/subsumption.verify.cpp @@ -30,4 +30,4 @@ } // clang-format on -static_assert(check_subsumption<int*>()); +static_assert(check_subsumption<int*>()); // expected-error {{call to 'check_subsumption' is ambiguous}} diff --git a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp --- a/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp +++ b/libcxx/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp @@ -58,10 +58,10 @@ static_assert(!std::weakly_incrementable<non_const_minus>); static_assert(!std::weakly_incrementable<non_integral_minus>); static_assert(!std::weakly_incrementable<bad_difference_type_good_minus>); -static_assert(!std::weakly_incrementable<not_default_initializable>); static_assert(!std::weakly_incrementable<not_movable>); static_assert(!std::weakly_incrementable<preinc_not_declared>); static_assert(!std::weakly_incrementable<postinc_not_declared>); +static_assert(std::weakly_incrementable<not_default_initializable>); static_assert(std::weakly_incrementable<incrementable_with_difference_type>); static_assert(std::weakly_incrementable<incrementable_without_difference_type>); static_assert(std::weakly_incrementable<difference_type_and_void_minus>); diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/default.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/default.pass.cpp deleted file mode 100644 --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/default.pass.cpp +++ /dev/null @@ -1,38 +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, c++11, c++14, c++17 - -// <iterator> - -// class back_insert_iterator - -// constexpr back_insert_iterator() noexcept = default; - -#include <iterator> -#include <vector> - -#include "test_macros.h" - -struct T { }; -using Container = std::vector<T>; - -constexpr bool test() { - std::back_insert_iterator<Container> it; - (void)it; - return true; -} - -int main(int, char**) { - ASSERT_NOEXCEPT(std::back_insert_iterator<Container>()); - - test(); - static_assert(test()); - - return 0; -} diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/default.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/default.pass.cpp deleted file mode 100644 --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/default.pass.cpp +++ /dev/null @@ -1,38 +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, c++11, c++14, c++17 - -// <iterator> - -// class front_insert_iterator - -// constexpr front_insert_iterator() noexcept = default; - -#include <iterator> -#include <vector> - -#include "test_macros.h" - -struct T { }; -using Container = std::vector<T>; - -constexpr bool test() { - std::front_insert_iterator<Container> it; - (void)it; - return true; -} - -int main(int, char**) { - ASSERT_NOEXCEPT(std::front_insert_iterator<Container>()); - - test(); - static_assert(test()); - - return 0; -} diff --git a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/default.pass.cpp b/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/default.pass.cpp deleted file mode 100644 --- a/libcxx/test/std/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/default.pass.cpp +++ /dev/null @@ -1,26 +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, c++11, c++14, c++17 - -// <iterator> - -// class insert_iterator - -// insert_iterator() = default; - -#include <iterator> -#include <vector> - -struct T { }; -using Container = std::vector<T>; - -int main(int, char**) { - std::insert_iterator<Container> it; (void)it; - return 0; -} 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 deleted file mode 100644 --- a/libcxx/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/default.pass.cpp +++ /dev/null @@ -1,42 +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, c++11, c++14, c++17 - -// <iterator> - -// class ostream_iterator - -// constexpr ostream_iterator() noexcept = default; - -#include <iterator> -#include <string> // char_traits - -#include "test_macros.h" - -struct MyTraits : std::char_traits<char> { - MyTraits(); // This should not be called. -}; - -constexpr bool test() { - std::ostream_iterator<int> it; - (void)it; - std::ostream_iterator<int, char, MyTraits> wit; - (void)wit; - return true; -} - -int main(int, char**) { - ASSERT_NOEXCEPT(std::ostream_iterator<int>()); - ASSERT_NOEXCEPT(std::ostream_iterator<int, char, MyTraits>()); - - test(); - static_assert(test()); - - return 0; -} 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 deleted file mode 100644 --- a/libcxx/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/default.pass.cpp +++ /dev/null @@ -1,37 +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, c++11, c++14, c++17 - -// <iterator> - -// class ostreambuf_iterator - -// constexpr ostreambuf_iterator() noexcept = default; - -#include <iterator> - -#include "test_macros.h" - -constexpr bool test() { - std::ostreambuf_iterator<char> it; - (void)it; - std::ostreambuf_iterator<wchar_t> wit; - (void)wit; - return true; -} - -int main(int, char**) { - ASSERT_NOEXCEPT(std::ostreambuf_iterator<char>()); - ASSERT_NOEXCEPT(std::ostreambuf_iterator<wchar_t>()); - - test(); - static_assert(test()); - - return 0; -} diff --git a/libcxx/test/std/ranges/range.req/range.view/view.compile.pass.cpp b/libcxx/test/std/ranges/range.req/range.view/view.compile.pass.cpp --- a/libcxx/test/std/ranges/range.req/range.view/view.compile.pass.cpp +++ b/libcxx/test/std/ranges/range.req/range.view/view.compile.pass.cpp @@ -46,7 +46,7 @@ static_assert(std::movable<NotDefaultInit>); static_assert(!std::default_initializable<NotDefaultInit>); static_assert(std::ranges::enable_view<NotDefaultInit>); -static_assert(!std::ranges::view<NotDefaultInit>); +static_assert(std::ranges::view<NotDefaultInit>); // The type would be a view, but it doesn't enable it with enable_view struct NotExplicitlyEnabled { diff --git a/libcxx/test/std/ranges/range.req/range.view/view.subsumption.compile.pass.cpp b/libcxx/test/std/ranges/range.req/range.view/view.subsumption.verify.cpp rename from libcxx/test/std/ranges/range.req/range.view/view.subsumption.compile.pass.cpp rename to libcxx/test/std/ranges/range.req/range.view/view.subsumption.verify.cpp --- a/libcxx/test/std/ranges/range.req/range.view/view.subsumption.compile.pass.cpp +++ b/libcxx/test/std/ranges/range.req/range.view/view.subsumption.verify.cpp @@ -29,25 +29,37 @@ }; namespace subsume_range { - template <std::ranges::view> - constexpr bool test() { return true; } - template <std::ranges::range> - constexpr bool test() { return false; } - static_assert(test<View>()); +template <std::ranges::view> +constexpr bool test() { + return true; } +template <std::ranges::range> +constexpr bool test() { + return false; +} +static_assert(test<View>()); +} // namespace subsume_range namespace subsume_movable { - template <std::ranges::view> - constexpr bool test() { return true; } - template <std::movable> - constexpr bool test() { return false; } - static_assert(test<View>()); +template <std::ranges::view> +constexpr bool test() { + return true; +} +template <std::movable> +constexpr bool test() { + return false; } +static_assert(test<View>()); +} // namespace subsume_movable namespace subsume_default_initializable { - template <std::ranges::view> - constexpr bool test() { return true; } - template <std::default_initializable> - constexpr bool test() { return false; } - static_assert(test<View>()); +template <std::ranges::view> +constexpr bool test() { + return true; +} +template <std::default_initializable> +constexpr bool test() { + return false; } +static_assert(test<View>()); // expected-error {{call to 'test' is ambiguous}} +} // namespace subsume_default_initializable diff --git a/libcxx/test/std/strings/string.view/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/strings/string.view/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/strings/string.view/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/strings/string.view/range_concept_conformance.compile.pass.cpp @@ -22,13 +22,13 @@ static_assert(std::same_as<stdr::iterator_t<std::string_view>, std::string_view::iterator>); static_assert(stdr::common_range<std::string_view>); static_assert(stdr::random_access_range<std::string_view>); -static_assert(!stdr::view<std::string_view>); +static_assert(stdr::view<std::string_view>&& stdr::enable_view<std::string_view>); static_assert(stdr::sized_range<std::string_view>); static_assert(stdr::borrowed_range<std::string_view>); static_assert(std::same_as<stdr::iterator_t<std::string_view const>, std::string_view::const_iterator>); static_assert(stdr::common_range<std::string_view const>); static_assert(stdr::random_access_range<std::string_view const>); -static_assert(!stdr::view<std::string_view const>); // FIXME: string_view needs to be patched so this is true +static_assert(!stdr::view<std::string_view const> && !stdr::enable_view<std::string_view const>); static_assert(stdr::sized_range<std::string_view const>); static_assert(stdr::borrowed_range<std::string_view const>);