diff options
author | Joe Loser <joeloser93@gmail.com> | 2022-01-21 15:01:34 -0500 |
---|---|---|
committer | Joe Loser <joeloser93@gmail.com> | 2022-01-21 19:46:45 -0500 |
commit | 4f547ee8b8a7d3e298c6cd95e58dd8916883e2d5 (patch) | |
tree | 5bcb85feaeb2103cd0d8f17b5da64e2f9622f7a5 | |
parent | 13fa17db3a720d149bcd0783856347a4f09cf634 (diff) |
[libc++][test] Add const and reference tests for enable_view. NFC.
As discussed in https://reviews.llvm.org/D117714, there is missing test coverage
for the behavior of `enable_view` when given a const or reference qualified
type. Add such tests showing the current behavior.
Differential Revision: https://reviews.llvm.org/D117918
-rw-r--r-- | libcxx/test/std/ranges/range.req/range.view/enable_view.compile.pass.cpp | 65 |
1 files changed, 61 insertions, 4 deletions
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 index 19ea867f3773..7a12ccfc51e7 100644 --- 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<Empty>); +static_assert(!std::ranges::enable_view<Empty&>); +static_assert(!std::ranges::enable_view<Empty&&>); +static_assert(!std::ranges::enable_view<const Empty>); +static_assert(!std::ranges::enable_view<const Empty&>); +static_assert(!std::ranges::enable_view<const Empty&&>); // Derives from view_base, but privately struct PrivateViewBase : private std::ranges::view_base { }; static_assert(!std::ranges::enable_view<PrivateViewBase>); +static_assert(!std::ranges::enable_view<PrivateViewBase&>); +static_assert(!std::ranges::enable_view<PrivateViewBase&&>); +static_assert(!std::ranges::enable_view<const PrivateViewBase>); +static_assert(!std::ranges::enable_view<const PrivateViewBase&>); +static_assert(!std::ranges::enable_view<const PrivateViewBase&&>); // Derives from view_base, but specializes enable_view to false struct EnableViewFalse : std::ranges::view_base { }; -namespace std::ranges { template <> constexpr bool enable_view<EnableViewFalse> = false; } +template <> constexpr bool std::ranges::enable_view<EnableViewFalse> = false; static_assert(!std::ranges::enable_view<EnableViewFalse>); - +static_assert(!std::ranges::enable_view<EnableViewFalse&>); +static_assert(!std::ranges::enable_view<EnableViewFalse&&>); +static_assert(std::ranges::enable_view<const EnableViewFalse>); +static_assert(!std::ranges::enable_view<const EnableViewFalse&>); +static_assert(!std::ranges::enable_view<const EnableViewFalse&&>); // Derives from view_base struct PublicViewBase : std::ranges::view_base { }; static_assert(std::ranges::enable_view<PublicViewBase>); +static_assert(!std::ranges::enable_view<PublicViewBase&>); +static_assert(!std::ranges::enable_view<PublicViewBase&&>); +static_assert(std::ranges::enable_view<const PublicViewBase>); +static_assert(!std::ranges::enable_view<const PublicViewBase&>); +static_assert(!std::ranges::enable_view<const PublicViewBase&&>); // Does not derive from view_base, but specializes enable_view to true struct EnableViewTrue { }; -namespace std::ranges { template <> constexpr bool enable_view<EnableViewTrue> = true; } +template <> constexpr bool std::ranges::enable_view<EnableViewTrue> = true; static_assert(std::ranges::enable_view<EnableViewTrue>); - +static_assert(!std::ranges::enable_view<EnableViewTrue&>); +static_assert(!std::ranges::enable_view<EnableViewTrue&&>); +static_assert(!std::ranges::enable_view<const EnableViewTrue>); +static_assert(!std::ranges::enable_view<const EnableViewTrue&>); +static_assert(!std::ranges::enable_view<const EnableViewTrue&&>); // Make sure that enable_view is a bool, not some other contextually-convertible-to-bool type. ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<Empty>), const bool); ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<PublicViewBase>), const bool); + +struct V1 : std::ranges::view_interface<V1> {}; +static_assert(std::ranges::enable_view<V1>); +static_assert(!std::ranges::enable_view<V1&>); +static_assert(!std::ranges::enable_view<V1&&>); +static_assert(std::ranges::enable_view<const V1>); +static_assert(!std::ranges::enable_view<const V1&>); +static_assert(!std::ranges::enable_view<const V1&&>); + +struct V2 : std::ranges::view_interface<V1>, std::ranges::view_interface<V2> {}; +static_assert(!std::ranges::enable_view<V2>); +static_assert(!std::ranges::enable_view<V2&>); +static_assert(!std::ranges::enable_view<V2&&>); +static_assert(!std::ranges::enable_view<const V2>); +static_assert(!std::ranges::enable_view<const V2&>); +static_assert(!std::ranges::enable_view<const V2&&>); + +struct V3 : std::ranges::view_interface<V1> {}; +static_assert(std::ranges::enable_view<V3>); +static_assert(!std::ranges::enable_view<V3&>); +static_assert(!std::ranges::enable_view<V3&&>); +static_assert(std::ranges::enable_view<const V3>); +static_assert(!std::ranges::enable_view<const V3&>); +static_assert(!std::ranges::enable_view<const V3&&>); + +struct PrivateInherit : private std::ranges::view_interface<PrivateInherit> {}; +static_assert(!std::ranges::enable_view<PrivateInherit>); + +// ADL-proof +struct Incomplete; +template<class T> struct Holder { T t; }; +static_assert(!std::ranges::enable_view<Holder<Incomplete>*>); + +static_assert(!std::ranges::enable_view<void>); |