1*4c2ad195SHui //===----------------------------------------------------------------------===// 2*4c2ad195SHui // 3*4c2ad195SHui // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*4c2ad195SHui // See https://llvm.org/LICENSE.txt for license information. 5*4c2ad195SHui // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*4c2ad195SHui // 7*4c2ad195SHui //===----------------------------------------------------------------------===// 8*4c2ad195SHui 9*4c2ad195SHui // UNSUPPORTED: c++03, c++11, c++14, c++17 10*4c2ad195SHui 11*4c2ad195SHui // ADL call with nested iterators of views should not look up base's view's 12*4c2ad195SHui // namespace 13*4c2ad195SHui 14*4c2ad195SHui #include <ranges> 15*4c2ad195SHui #include <tuple> 16*4c2ad195SHui 17*4c2ad195SHui #include "test_macros.h" 18*4c2ad195SHui 19*4c2ad195SHui #ifndef TEST_HAS_NO_LOCALIZATION 20*4c2ad195SHui #include <istream> 21*4c2ad195SHui #endif 22*4c2ad195SHui namespace adl { 23*4c2ad195SHui 24*4c2ad195SHui struct BaseView : std::ranges::view_base { 25*4c2ad195SHui int* begin() const; 26*4c2ad195SHui int* end() const; 27*4c2ad195SHui }; 28*4c2ad195SHui 29*4c2ad195SHui struct TupleView : std::ranges::view_base { 30*4c2ad195SHui std::tuple<int>* begin() const; 31*4c2ad195SHui std::tuple<int>* end() const; 32*4c2ad195SHui }; 33*4c2ad195SHui 34*4c2ad195SHui struct NestedView : std::ranges::view_base { 35*4c2ad195SHui BaseView* begin() const; 36*4c2ad195SHui BaseView* end() const; 37*4c2ad195SHui }; 38*4c2ad195SHui 39*4c2ad195SHui struct Pred { 40*4c2ad195SHui bool operator()(const auto&...) const; 41*4c2ad195SHui }; 42*4c2ad195SHui 43*4c2ad195SHui struct Sentinel { 44*4c2ad195SHui bool operator==(const auto&) const; 45*4c2ad195SHui }; 46*4c2ad195SHui 47*4c2ad195SHui struct Value { 48*4c2ad195SHui friend std::istream& operator>>(std::istream&, Value); 49*4c2ad195SHui }; 50*4c2ad195SHui 51*4c2ad195SHui void adl_func(const auto&); 52*4c2ad195SHui 53*4c2ad195SHui } // namespace adl 54*4c2ad195SHui 55*4c2ad195SHui template <class View> 56*4c2ad195SHui concept CanFindADLFunc = requires(std::ranges::iterator_t<View> it) { adl_func(it); }; 57*4c2ad195SHui 58*4c2ad195SHui static_assert(!CanFindADLFunc<std::ranges::elements_view<adl::TupleView, 0>>); 59*4c2ad195SHui static_assert(!CanFindADLFunc<std::ranges::filter_view<adl::BaseView, adl::Pred>>); 60*4c2ad195SHui static_assert(!CanFindADLFunc<std::ranges::iota_view<int, adl::Sentinel>>); 61*4c2ad195SHui 62*4c2ad195SHui #ifndef TEST_HAS_NO_LOCALIZATION 63*4c2ad195SHui static_assert(!CanFindADLFunc<std::ranges::istream_view<adl::Value>>); 64*4c2ad195SHui #endif 65*4c2ad195SHui 66*4c2ad195SHui static_assert(!CanFindADLFunc<std::ranges::join_view<adl::NestedView>>); 67*4c2ad195SHui 68*4c2ad195SHui static_assert(!CanFindADLFunc<std::ranges::lazy_split_view<adl::BaseView, adl::BaseView>>); 69*4c2ad195SHui using InnerRange = 70*4c2ad195SHui typename std::ranges::iterator_t<std::ranges::lazy_split_view<adl::BaseView, adl::BaseView>>::value_type; 71*4c2ad195SHui static_assert(!CanFindADLFunc<InnerRange >); 72*4c2ad195SHui 73*4c2ad195SHui static_assert(!CanFindADLFunc<std::ranges::split_view<adl::BaseView, adl::BaseView>>); 74*4c2ad195SHui static_assert(!CanFindADLFunc<std::ranges::transform_view<adl::BaseView, adl::Pred>>); 75*4c2ad195SHui 76*4c2ad195SHui #if TEST_STD_VER >= 23 77*4c2ad195SHui static_assert(!CanFindADLFunc<std::ranges::zip_view<adl::BaseView>>); 78*4c2ad195SHui #endif 79