//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // // template // inline constexpr bool enable_view = ...; #include #include "test_macros.h" // 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 { }; 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 { }; 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);