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 // UNSUPPORTED: libcpp-no-concepts 11 // UNSUPPORTED: libcpp-has-no-incomplete-ranges 12 13 // template<class T> 14 // concept borrowed_range; 15 16 #include <ranges> 17 18 struct NotRange { 19 int begin() const; 20 int end() const; 21 }; 22 23 struct Range { 24 int *begin(); 25 int *end(); 26 }; 27 28 struct ConstRange { 29 int *begin() const; 30 int *end() const; 31 }; 32 33 struct BorrowedRange { 34 int *begin() const; 35 int *end() const; 36 }; 37 38 template<> 39 inline constexpr bool std::ranges::enable_borrowed_range<BorrowedRange> = true; 40 41 static_assert(!std::ranges::borrowed_range<NotRange>); 42 static_assert(!std::ranges::borrowed_range<NotRange&>); 43 static_assert(!std::ranges::borrowed_range<const NotRange>); 44 static_assert(!std::ranges::borrowed_range<const NotRange&>); 45 static_assert(!std::ranges::borrowed_range<NotRange&&>); 46 47 static_assert(!std::ranges::borrowed_range<Range>); 48 static_assert( std::ranges::borrowed_range<Range&>); 49 static_assert(!std::ranges::borrowed_range<const Range>); 50 static_assert(!std::ranges::borrowed_range<const Range&>); 51 static_assert(!std::ranges::borrowed_range<Range&&>); 52 53 static_assert(!std::ranges::borrowed_range<ConstRange>); 54 static_assert( std::ranges::borrowed_range<ConstRange&>); 55 static_assert(!std::ranges::borrowed_range<const ConstRange>); 56 static_assert( std::ranges::borrowed_range<const ConstRange&>); 57 static_assert(!std::ranges::borrowed_range<ConstRange&&>); 58 59 static_assert( std::ranges::borrowed_range<BorrowedRange>); 60 static_assert( std::ranges::borrowed_range<BorrowedRange&>); 61 static_assert( std::ranges::borrowed_range<const BorrowedRange>); 62 static_assert( std::ranges::borrowed_range<const BorrowedRange&>); 63 static_assert( std::ranges::borrowed_range<BorrowedRange&&>); 64