diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt --- a/libcxx/include/CMakeLists.txt +++ b/libcxx/include/CMakeLists.txt @@ -38,6 +38,7 @@ __ranges/begin.h __ranges/cbegin.h __ranges/cend.h + __ranges/concepts.h __ranges/end.h __ranges/enable_borrowed_range.h __split_buffer diff --git a/libcxx/include/__ranges/concepts.h b/libcxx/include/__ranges/concepts.h new file mode 100644 --- /dev/null +++ b/libcxx/include/__ranges/concepts.h @@ -0,0 +1,68 @@ +// -*- C++ -*- +//===--------------------- __ranges/concepts.h ----------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// +#ifndef _LIBCPP_RANGES_CONCEPTS_H +#define _LIBCPP_RANGES_CONCEPTS_H + +#include <__config> +#include <__ranges/begin.h> +#include <__ranges/end.h> +#include + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#pragma GCC system_header +#endif + +_LIBCPP_PUSH_MACROS +#include <__undef_macros> + +_LIBCPP_BEGIN_NAMESPACE_STD + +// clang-format off + +#if !defined(_LIBCPP_HAS_NO_RANGES) + +namespace ranges { + // [range.range] + template + concept range = requires(_Tp& __t) { + ranges::begin(__t); // sometimes equality-preserving + ranges::end(__t); + }; + + // `iterator_t` defined in <__ranges/begin.h> + + template + using sentinel_t = decltype(ranges::end(declval<_Rp&>())); + + template + using range_difference_t = iter_difference_t >; + + template + using range_value_t = iter_value_t >; + + template + using range_reference_t = iter_reference_t >; + + template + using range_rvalue_reference_t = iter_rvalue_reference_t >; + + // [range.refinements], other range refinements + template + concept common_range = range<_Tp> && same_as, sentinel_t<_Tp> >; +} // namespace ranges + +#endif // !defined(_LIBCPP_HAS_NO_RANGES) + +// clang-format on + +_LIBCPP_END_NAMESPACE_STD + +_LIBCPP_POP_MACROS + +#endif // _LIBCPP_RANGES_CONCEPTS_H diff --git a/libcxx/include/ranges b/libcxx/include/ranges --- a/libcxx/include/ranges +++ b/libcxx/include/ranges @@ -26,11 +26,30 @@ } // [range.range], ranges + template + concept range = see below; + template inline constexpr bool enable_borrowed_range = false; template using iterator_t = decltype(ranges::begin(declval())); + template + using iterator_t = decltype(ranges::begin(declval())); + template + using sentinel_t = decltype(ranges::end(declval())); + template + using range_difference_t = iter_difference_t>; + template + using range_value_t = iter_value_t>; + template + using range_reference_t = iter_reference_t>; + template + using range_rvalue_reference_t = iter_rvalue_reference_t>; + + // [range.refinements], other range refinements + template + concept common_range = see below; } */ @@ -39,6 +58,8 @@ #include <__ranges/begin.h> #include <__ranges/cbegin.h> #include <__ranges/cend.h> +#include <__ranges/concepts.h> +#include <__ranges/end.h> #include <__ranges/enable_borrowed_range.h> #include <__ranges/end.h> #include // Required by the standard. diff --git a/libcxx/test/std/containers/associative/map/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/map/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/associative/map/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/map/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/associative/multimap/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/multimap/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/associative/multimap/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/multimap/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/associative/multiset/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/multiset/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/associative/multiset/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/multiset/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/associative/set/range_concept.conformance.compile.pass.cpp copy from libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp copy to libcxx/test/std/containers/associative/set/range_concept.conformance.compile.pass.cpp --- a/libcxx/test/std/containers/views/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/associative/set/range_concept.conformance.compile.pass.cpp @@ -9,16 +9,12 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: libcpp-no-concepts // UNSUPPORTED: gcc-10 -// XFAIL: msvc && clang -// span +// set -#include +#include -#include #include -using range = std::span; -namespace stdr = std::ranges; - -static_assert(std::same_as, range::iterator>); +static_assert(std::ranges::range >); +static_assert(std::ranges::range const>); diff --git a/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/array/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/deque/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/sequences/forwardlist/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/forwardlist/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/forwardlist/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/forwardlist/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/sequences/list/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/list/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/list/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/list/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector.bool/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/sequences/vector/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/unord/unord.map/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.map/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/unord/unord.map/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.map/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/unord/unord.multimap/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.multimap/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/unord/unord.multimap/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multimap/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/unord/unord.multiset/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.multiset/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/unord/unord.multiset/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.multiset/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/containers/unord/unord.set/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/containers/unord/unord.set/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/containers/unord/unord.set/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/containers/unord/unord.set/range_concept_conformance.compile.pass.cpp @@ -22,4 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, range::const_iterator>); +static_assert(std::same_as, range::const_iterator>); +static_assert(stdr::common_range); 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 @@ -22,3 +22,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); + +static_assert(std::same_as, range::iterator>); +static_assert(std::same_as, range::iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/input.output/filesystems/class.directory_iterator/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/input.output/filesystems/class.directory_iterator/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/input.output/filesystems/class.directory_iterator/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/input.output/filesystems/class.directory_iterator/range_concept_conformance.compile.pass.cpp @@ -9,7 +9,7 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: libcpp-no-concepts // UNSUPPORTED: gcc-10 -// XFAIL: msvc && clang +// XFAIL: * // directory_iterator, recursive_directory_iterator @@ -21,6 +21,17 @@ namespace stdr = std::ranges; static_assert(std::same_as, fs::directory_iterator>); +static_assert(std::same_as, fs::directory_iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, fs::directory_iterator>); +static_assert(std::same_as, fs::directory_iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, fs::recursive_directory_iterator>); +static_assert(std::same_as, fs::recursive_directory_iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, fs::recursive_directory_iterator>); +static_assert(std::same_as, fs::recursive_directory_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/input.output/filesystems/class.path/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/input.output/filesystems/class.path/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/input.output/filesystems/class.path/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/input.output/filesystems/class.path/range_concept_conformance.compile.pass.cpp @@ -21,4 +21,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, fs::path::iterator>); +static_assert(std::same_as, fs::path::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, fs::path::const_iterator>); +static_assert(std::same_as, fs::path::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/ranges/range.range/helper_aliases.compile.pass.cpp b/libcxx/test/std/ranges/range.range/helper_aliases.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/ranges/range.range/helper_aliases.compile.pass.cpp @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// template +// using range_difference_t = iter_difference_t>; + +// template +// using range_value_t = iter_value_t>; + +// template +// using range_reference_t = iter_reference_t>; + +// template +// using range_rvalue_reference_t = iter_rvalue_reference_t>; + +#include + +#include + +#include "test_range.h" + +namespace stdr = std::ranges; + +static_assert(std::same_as >, std::iter_difference_t >); +static_assert(std::same_as >, std::iter_value_t >); +static_assert(std::same_as >, std::iter_reference_t >); +static_assert(std::same_as >, std::iter_rvalue_reference_t >); diff --git a/libcxx/test/std/ranges/range.range/range.compile.pass.cpp b/libcxx/test/std/ranges/range.range/range.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/ranges/range.range/range.compile.pass.cpp @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// template +// concept range; + +#include + +#include + +#include "test_range.h" + +namespace stdr = std::ranges; + +static_assert(stdr::range >); + +struct incompatible_iterators { + int* begin(); + long* end(); +}; +static_assert(!stdr::range); + +struct int_begin_int_end { + int begin(); + int end(); +}; +static_assert(!stdr::range); + +struct iterator_begin_int_end { + int* begin(); + int end(); +}; +static_assert(!stdr::range); + +struct int_begin_iterator_end { + int begin(); + int* end(); +}; +static_assert(!stdr::range); diff --git a/libcxx/test/std/ranges/range.range/sentinel_t.compile.pass.cpp b/libcxx/test/std/ranges/range.range/sentinel_t.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/ranges/range.range/sentinel_t.compile.pass.cpp @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// UNSUPPORTED: libcpp-no-concepts +// UNSUPPORTED: gcc-10 + +// template +// using sentinel_t = decltype(ranges::end(declval<_Rp&>())); + +#include + +#include + +#include "test_iterators.h" +#include "test_range.h" + +namespace stdr = std::ranges; + +static_assert(std::same_as >, sentinel>); +static_assert(std::same_as const>, sentinel>); +static_assert(std::same_as >, sentinel>); +static_assert(std::same_as >, input_iterator >); +static_assert(std::same_as const>, input_iterator >); +static_assert(std::same_as >, input_iterator >); diff --git a/libcxx/test/std/ranges/range.refinements/common_range.compile.pass.cpp b/libcxx/test/std/ranges/range.refinements/common_range.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/ranges/range.refinements/common_range.compile.pass.cpp @@ -0,0 +1,56 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// UNSUPPORTED: libcpp-no-concepts +// XFAIL: msvc && clang + +// template +// concept common_range; + +#include + +#include "test_iterators.h" +#include "test_range.h" + +namespace stdr = std::ranges; + +static_assert(!stdr::common_range >); +static_assert(!stdr::common_range const>); + +static_assert(!stdr::common_range >); +static_assert(!stdr::common_range const>); + +static_assert(stdr::common_range >); +static_assert(stdr::common_range const>); + +static_assert(stdr::common_range >); +static_assert(!stdr::common_range const>); + +struct subtly_not_common { + int* begin() const; + int const* end() const; +}; +static_assert(stdr::range && !stdr::common_range); +static_assert(stdr::range && !stdr::common_range); + +struct common_range_non_const_only { + int* begin() const; + int* end(); + int const* end() const; +}; +static_assert(stdr::range&& stdr::common_range); +static_assert(stdr::range && !stdr::common_range); + +struct common_range_const_only { + int* begin(); + int const* begin() const; + int const* end() const; +}; +static_assert(stdr::range && !stdr::common_range); +static_assert(stdr::range&& stdr::common_range); diff --git a/libcxx/test/std/re/re.results/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/re/re.results/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/re/re.results/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/re/re.results/range_concept_conformance.compile.pass.cpp @@ -21,4 +21,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, std::cmatch::iterator>); +static_assert(std::same_as, std::cmatch::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, std::cmatch::const_iterator>); +static_assert(std::same_as, std::cmatch::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/std/strings/basic.string/range_concept_conformance.compile.pass.cpp b/libcxx/test/std/strings/basic.string/range_concept_conformance.compile.pass.cpp --- a/libcxx/test/std/strings/basic.string/range_concept_conformance.compile.pass.cpp +++ b/libcxx/test/std/strings/basic.string/range_concept_conformance.compile.pass.cpp @@ -21,4 +21,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, std::string::iterator>); +static_assert(std::same_as, std::string::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, std::string::const_iterator>); +static_assert(std::same_as, std::string::const_iterator>); +static_assert(stdr::common_range); 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 @@ -21,4 +21,9 @@ namespace stdr = std::ranges; static_assert(std::same_as, std::string_view::iterator>); +static_assert(std::same_as, std::string_view::iterator>); +static_assert(stdr::common_range); + static_assert(std::same_as, std::string_view::const_iterator>); +static_assert(std::same_as, std::string_view::const_iterator>); +static_assert(stdr::common_range); diff --git a/libcxx/test/support/test_range.h b/libcxx/test/support/test_range.h --- a/libcxx/test/support/test_range.h +++ b/libcxx/test/support/test_range.h @@ -22,7 +22,7 @@ }; // clang-format off -template