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 // class std::ranges::subrange;
14 
15 #include <ranges>
16 
17 #include "types.h"
18 #include <cassert>
19 #include "test_macros.h"
20 #include "test_iterators.h"
21 #include <tuple>
22 #include <utility>
23 
24 static_assert( std::is_convertible_v<ForwardSubrange, std::pair<ForwardIter, ForwardIter>>);
25 static_assert( std::is_convertible_v<ForwardSubrange, std::tuple<ForwardIter, ForwardIter>>);
26 static_assert(!std::is_convertible_v<ForwardSubrange, std::tuple<ForwardIter, ForwardIter>&>);
27 static_assert(!std::is_convertible_v<ForwardSubrange, std::tuple<ForwardIter, ForwardIter, ForwardIter>>);
28 static_assert( std::is_convertible_v<ConvertibleForwardSubrange, std::tuple<ConvertibleForwardIter, int*>>);
29 static_assert(!std::is_convertible_v<SizedIntPtrSubrange, std::tuple<long*, int*>>);
30 static_assert( std::is_convertible_v<SizedIntPtrSubrange, std::tuple<int*, int*>>);
31 
32 constexpr bool test() {
33   ForwardSubrange a(ForwardIter(globalBuff), ForwardIter(globalBuff + 8));
34   std::pair<ForwardIter, ForwardIter> aPair = a;
35   assert(aPair.first.base() == globalBuff);
36   assert(aPair.second.base() == globalBuff + 8);
37   std::tuple<ForwardIter, ForwardIter> aTuple = a;
38   assert(get<0>(aTuple).base() == globalBuff);
39   assert(get<1>(aTuple).base() == globalBuff + 8);
40 
41   return true;
42 }
43 
44 int main(int, char**) {
45   test();
46   static_assert(test());
47 
48   return 0;
49 }
50