diff --git a/libcxx/test/std/ranges/range.req/range.view/enable_view.compile.pass.cpp b/libcxx/test/std/ranges/range.req/range.view/enable_view.compile.pass.cpp --- a/libcxx/test/std/ranges/range.req/range.view/enable_view.compile.pass.cpp +++ b/libcxx/test/std/ranges/range.req/range.view/enable_view.compile.pass.cpp @@ -22,27 +22,84 @@ // Doesn't derive from view_base struct Empty { }; static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); // Derives from view_base, but privately struct PrivateViewBase : private std::ranges::view_base { }; static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); // Derives from view_base, but specializes enable_view to false struct EnableViewFalse : std::ranges::view_base { }; -namespace std::ranges { template <> constexpr bool enable_view = false; } +template <> constexpr bool std::ranges::enable_view = false; static_assert(!std::ranges::enable_view); - +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); // Derives from view_base struct PublicViewBase : std::ranges::view_base { }; static_assert(std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); // Does not derive from view_base, but specializes enable_view to true struct EnableViewTrue { }; -namespace std::ranges { template <> constexpr bool enable_view = true; } +template <> constexpr bool std::ranges::enable_view = true; static_assert(std::ranges::enable_view); - +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); // Make sure that enable_view is a bool, not some other contextually-convertible-to-bool type. ASSERT_SAME_TYPE(decltype(std::ranges::enable_view), const bool); ASSERT_SAME_TYPE(decltype(std::ranges::enable_view), const bool); + +struct V1 : std::ranges::view_interface {}; +static_assert(std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); + +struct V2 : std::ranges::view_interface, std::ranges::view_interface {}; +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); + +struct V3 : std::ranges::view_interface {}; +static_assert(std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(std::ranges::enable_view); +static_assert(!std::ranges::enable_view); +static_assert(!std::ranges::enable_view); + +struct PrivateInherit : private std::ranges::view_interface {}; +static_assert(!std::ranges::enable_view); + +// ADL-proof +struct Incomplete; +template struct Holder { T t; }; +static_assert(!std::ranges::enable_view*>); + +static_assert(!std::ranges::enable_view);