1*770602cfSLouis Dionne //===----------------------------------------------------------------------===// 2*770602cfSLouis Dionne // 3*770602cfSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*770602cfSLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5*770602cfSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*770602cfSLouis Dionne // 7*770602cfSLouis Dionne //===----------------------------------------------------------------------===// 8*770602cfSLouis Dionne 9*770602cfSLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17 10*770602cfSLouis Dionne 11*770602cfSLouis Dionne // template<class T> 12*770602cfSLouis Dionne // concept borrowed_range; 13*770602cfSLouis Dionne 14*770602cfSLouis Dionne #include <ranges> 15*770602cfSLouis Dionne 16*770602cfSLouis Dionne struct NotRange { 17*770602cfSLouis Dionne int begin() const; 18*770602cfSLouis Dionne int end() const; 19*770602cfSLouis Dionne }; 20*770602cfSLouis Dionne 21*770602cfSLouis Dionne struct Range { 22*770602cfSLouis Dionne int *begin(); 23*770602cfSLouis Dionne int *end(); 24*770602cfSLouis Dionne }; 25*770602cfSLouis Dionne 26*770602cfSLouis Dionne struct ConstRange { 27*770602cfSLouis Dionne int *begin() const; 28*770602cfSLouis Dionne int *end() const; 29*770602cfSLouis Dionne }; 30*770602cfSLouis Dionne 31*770602cfSLouis Dionne struct BorrowedRange { 32*770602cfSLouis Dionne int *begin() const; 33*770602cfSLouis Dionne int *end() const; 34*770602cfSLouis Dionne }; 35*770602cfSLouis Dionne 36*770602cfSLouis Dionne template<> 37*770602cfSLouis Dionne inline constexpr bool std::ranges::enable_borrowed_range<BorrowedRange> = true; 38*770602cfSLouis Dionne 39*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<NotRange>); 40*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<NotRange&>); 41*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<const NotRange>); 42*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<const NotRange&>); 43*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<NotRange&&>); 44*770602cfSLouis Dionne 45*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<Range>); 46*770602cfSLouis Dionne static_assert( std::ranges::borrowed_range<Range&>); 47*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<const Range>); 48*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<const Range&>); 49*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<Range&&>); 50*770602cfSLouis Dionne 51*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<ConstRange>); 52*770602cfSLouis Dionne static_assert( std::ranges::borrowed_range<ConstRange&>); 53*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<const ConstRange>); 54*770602cfSLouis Dionne static_assert( std::ranges::borrowed_range<const ConstRange&>); 55*770602cfSLouis Dionne static_assert(!std::ranges::borrowed_range<ConstRange&&>); 56*770602cfSLouis Dionne 57*770602cfSLouis Dionne static_assert( std::ranges::borrowed_range<BorrowedRange>); 58*770602cfSLouis Dionne static_assert( std::ranges::borrowed_range<BorrowedRange&>); 59*770602cfSLouis Dionne static_assert( std::ranges::borrowed_range<const BorrowedRange>); 60*770602cfSLouis Dionne static_assert( std::ranges::borrowed_range<const BorrowedRange&>); 61*770602cfSLouis Dionne static_assert( std::ranges::borrowed_range<BorrowedRange&&>); 62