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