xref: /llvm-project/libcxx/test/std/ranges/range.req/range.range/borrowed_range.compile.pass.cpp (revision d2baefae6846765eef6a6dd69d4fdf1082ce29ad)
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