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 @@ -33,6 +33,10 @@ ranges::end(__t); }; + template + concept borrowed_range = range<_Range> && + (is_lvalue_reference_v<_Range> || enable_borrowed_range>); + // `iterator_t` defined in <__ranges/access.h> template diff --git a/libcxx/test/std/ranges/range.range/borrowed_range.compile.pass.cpp b/libcxx/test/std/ranges/range.range/borrowed_range.compile.pass.cpp new file mode 100644 --- /dev/null +++ b/libcxx/test/std/ranges/range.range/borrowed_range.compile.pass.cpp @@ -0,0 +1,63 @@ +//===----------------------------------------------------------------------===// +// +// 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 borrowed_range; + +#include + +struct NotRange { + int begin() const; + int end() const; +}; + +struct Range { + int *begin(); + int *end(); +}; + +struct ConstRange { + int *begin() const; + int *end() const; +}; + +struct BorrowedRange { + int *begin() const; + int *end() const; +}; + +template<> +inline constexpr bool std::ranges::enable_borrowed_range = true; + +static_assert(!std::ranges::borrowed_range); +static_assert(!std::ranges::borrowed_range); +static_assert(!std::ranges::borrowed_range); +static_assert(!std::ranges::borrowed_range); +static_assert(!std::ranges::borrowed_range); + +static_assert(!std::ranges::borrowed_range); +static_assert( std::ranges::borrowed_range); +static_assert(!std::ranges::borrowed_range); +static_assert(!std::ranges::borrowed_range); +static_assert(!std::ranges::borrowed_range); + +static_assert(!std::ranges::borrowed_range); +static_assert( std::ranges::borrowed_range); +static_assert(!std::ranges::borrowed_range); +static_assert( std::ranges::borrowed_range); +static_assert(!std::ranges::borrowed_range); + +static_assert( std::ranges::borrowed_range); +static_assert( std::ranges::borrowed_range); +static_assert( std::ranges::borrowed_range); +static_assert( std::ranges::borrowed_range); +static_assert( std::ranges::borrowed_range);