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 // constexpr outer-iterator(outer-iterator<!Const> i) 12 // requires Const && convertible_to<iterator_t<View>, iterator_t<Base>> 13 14 #include <ranges> 15 16 #include <string_view> 17 #include <type_traits> 18 #include <utility> 19 #include "../types.h" 20 21 // outer-iterator<Const = true> 22 23 template <class Iter> 24 concept IsConstOuterIter = requires (Iter i) { 25 { *(*i).begin() } -> std::same_as<const char&>; 26 }; 27 static_assert( IsConstOuterIter<OuterIterConst>); 28 29 static_assert( std::convertible_to< 30 std::ranges::iterator_t<SplitViewDiff>, std::ranges::iterator_t<const SplitViewDiff>>); 31 32 // outer-iterator<Const = false> 33 34 template <class Iter> 35 concept IsNonConstOuterIter = requires (Iter i) { 36 { *(*i).begin() } -> std::same_as<char&>; 37 }; 38 static_assert( IsNonConstOuterIter<OuterIterNonConst>); 39 40 static_assert(!std::is_constructible_v<OuterIterNonConst, OuterIterConst>); 41 test()42constexpr bool test() { 43 [[maybe_unused]] OuterIterConst i(OuterIterNonConst{}); 44 45 return true; 46 } 47 main(int,char **)48int main(int, char**) { 49 test(); 50 static_assert(test()); 51 52 return 0; 53 } 54