1d8fad661SChristopher Di Bella //===----------------------------------------------------------------------===// 2d8fad661SChristopher Di Bella // 3d8fad661SChristopher Di Bella // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4d8fad661SChristopher Di Bella // See https://llvm.org/LICENSE.txt for license information. 5d8fad661SChristopher Di Bella // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d8fad661SChristopher Di Bella // 7d8fad661SChristopher Di Bella //===----------------------------------------------------------------------===// 8d8fad661SChristopher Di Bella 9d8fad661SChristopher Di Bella // UNSUPPORTED: c++03, c++11, c++14, c++17 1071909de3SMark de Wever // UNSUPPORTED: libcpp-has-no-incomplete-ranges 11d8fad661SChristopher Di Bella 12d8fad661SChristopher Di Bella // <ranges> 13d8fad661SChristopher Di Bella 14d8fad661SChristopher Di Bella // template<class T> 15d8fad661SChristopher Di Bella // inline constexpr bool enable_view = ...; 16d8fad661SChristopher Di Bella 17d8fad661SChristopher Di Bella #include <ranges> 18d8fad661SChristopher Di Bella 19d8fad661SChristopher Di Bella #include "test_macros.h" 20d8fad661SChristopher Di Bella 21d8fad661SChristopher Di Bella // Doesn't derive from view_base 22d8fad661SChristopher Di Bella struct Empty { }; 23d8fad661SChristopher Di Bella static_assert(!std::ranges::enable_view<Empty>); 24*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<Empty&>); 25*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<Empty&&>); 26*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const Empty>); 27*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const Empty&>); 28*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const Empty&&>); 29d8fad661SChristopher Di Bella 30d8fad661SChristopher Di Bella // Derives from view_base, but privately 31d8fad661SChristopher Di Bella struct PrivateViewBase : private std::ranges::view_base { }; 32d8fad661SChristopher Di Bella static_assert(!std::ranges::enable_view<PrivateViewBase>); 33*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<PrivateViewBase&>); 34*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<PrivateViewBase&&>); 35*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const PrivateViewBase>); 36*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const PrivateViewBase&>); 37*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const PrivateViewBase&&>); 38d8fad661SChristopher Di Bella 39d8fad661SChristopher Di Bella // Derives from view_base, but specializes enable_view to false 40d8fad661SChristopher Di Bella struct EnableViewFalse : std::ranges::view_base { }; 41*4f547ee8SJoe Loser template <> constexpr bool std::ranges::enable_view<EnableViewFalse> = false; 42d8fad661SChristopher Di Bella static_assert(!std::ranges::enable_view<EnableViewFalse>); 43*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<EnableViewFalse&>); 44*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<EnableViewFalse&&>); 45*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<const EnableViewFalse>); 46*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const EnableViewFalse&>); 47*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const EnableViewFalse&&>); 48d8fad661SChristopher Di Bella 49d8fad661SChristopher Di Bella // Derives from view_base 50d8fad661SChristopher Di Bella struct PublicViewBase : std::ranges::view_base { }; 51d8fad661SChristopher Di Bella static_assert(std::ranges::enable_view<PublicViewBase>); 52*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<PublicViewBase&>); 53*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<PublicViewBase&&>); 54*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<const PublicViewBase>); 55*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const PublicViewBase&>); 56*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const PublicViewBase&&>); 57d8fad661SChristopher Di Bella 58d8fad661SChristopher Di Bella // Does not derive from view_base, but specializes enable_view to true 59d8fad661SChristopher Di Bella struct EnableViewTrue { }; 60*4f547ee8SJoe Loser template <> constexpr bool std::ranges::enable_view<EnableViewTrue> = true; 61d8fad661SChristopher Di Bella static_assert(std::ranges::enable_view<EnableViewTrue>); 62*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<EnableViewTrue&>); 63*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<EnableViewTrue&&>); 64*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const EnableViewTrue>); 65*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const EnableViewTrue&>); 66*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const EnableViewTrue&&>); 67d8fad661SChristopher Di Bella 68d8fad661SChristopher Di Bella // Make sure that enable_view is a bool, not some other contextually-convertible-to-bool type. 69d8fad661SChristopher Di Bella ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<Empty>), const bool); 70d8fad661SChristopher Di Bella ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<PublicViewBase>), const bool); 71*4f547ee8SJoe Loser 72*4f547ee8SJoe Loser struct V1 : std::ranges::view_interface<V1> {}; 73*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<V1>); 74*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V1&>); 75*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V1&&>); 76*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<const V1>); 77*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V1&>); 78*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V1&&>); 79*4f547ee8SJoe Loser 80*4f547ee8SJoe Loser struct V2 : std::ranges::view_interface<V1>, std::ranges::view_interface<V2> {}; 81*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V2>); 82*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V2&>); 83*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V2&&>); 84*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V2>); 85*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V2&>); 86*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V2&&>); 87*4f547ee8SJoe Loser 88*4f547ee8SJoe Loser struct V3 : std::ranges::view_interface<V1> {}; 89*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<V3>); 90*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V3&>); 91*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<V3&&>); 92*4f547ee8SJoe Loser static_assert(std::ranges::enable_view<const V3>); 93*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V3&>); 94*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<const V3&&>); 95*4f547ee8SJoe Loser 96*4f547ee8SJoe Loser struct PrivateInherit : private std::ranges::view_interface<PrivateInherit> {}; 97*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<PrivateInherit>); 98*4f547ee8SJoe Loser 99*4f547ee8SJoe Loser // ADL-proof 100*4f547ee8SJoe Loser struct Incomplete; 101*4f547ee8SJoe Loser template<class T> struct Holder { T t; }; 102*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<Holder<Incomplete>*>); 103*4f547ee8SJoe Loser 104*4f547ee8SJoe Loser static_assert(!std::ranges::enable_view<void>); 105