summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoe Loser <joeloser93@gmail.com>2022-01-21 15:01:34 -0500
committerJoe Loser <joeloser93@gmail.com>2022-01-21 19:46:45 -0500
commit4f547ee8b8a7d3e298c6cd95e58dd8916883e2d5 (patch)
tree5bcb85feaeb2103cd0d8f17b5da64e2f9622f7a5
parent13fa17db3a720d149bcd0783856347a4f09cf634 (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.cpp65
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>);