Skip to content

Commit 4f547ee

Browse files
committed
[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
1 parent 13fa17d commit 4f547ee

File tree

1 file changed

+61
-4
lines changed

1 file changed

+61
-4
lines changed

libcxx/test/std/ranges/range.req/range.view/enable_view.compile.pass.cpp

Lines changed: 61 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,84 @@
2222
// Doesn't derive from view_base
2323
struct Empty { };
2424
static_assert(!std::ranges::enable_view<Empty>);
25+
static_assert(!std::ranges::enable_view<Empty&>);
26+
static_assert(!std::ranges::enable_view<Empty&&>);
27+
static_assert(!std::ranges::enable_view<const Empty>);
28+
static_assert(!std::ranges::enable_view<const Empty&>);
29+
static_assert(!std::ranges::enable_view<const Empty&&>);
2530

2631
// Derives from view_base, but privately
2732
struct PrivateViewBase : private std::ranges::view_base { };
2833
static_assert(!std::ranges::enable_view<PrivateViewBase>);
34+
static_assert(!std::ranges::enable_view<PrivateViewBase&>);
35+
static_assert(!std::ranges::enable_view<PrivateViewBase&&>);
36+
static_assert(!std::ranges::enable_view<const PrivateViewBase>);
37+
static_assert(!std::ranges::enable_view<const PrivateViewBase&>);
38+
static_assert(!std::ranges::enable_view<const PrivateViewBase&&>);
2939

3040
// Derives from view_base, but specializes enable_view to false
3141
struct EnableViewFalse : std::ranges::view_base { };
32-
namespace std::ranges { template <> constexpr bool enable_view<EnableViewFalse> = false; }
42+
template <> constexpr bool std::ranges::enable_view<EnableViewFalse> = false;
3343
static_assert(!std::ranges::enable_view<EnableViewFalse>);
34-
44+
static_assert(!std::ranges::enable_view<EnableViewFalse&>);
45+
static_assert(!std::ranges::enable_view<EnableViewFalse&&>);
46+
static_assert(std::ranges::enable_view<const EnableViewFalse>);
47+
static_assert(!std::ranges::enable_view<const EnableViewFalse&>);
48+
static_assert(!std::ranges::enable_view<const EnableViewFalse&&>);
3549

3650
// Derives from view_base
3751
struct PublicViewBase : std::ranges::view_base { };
3852
static_assert(std::ranges::enable_view<PublicViewBase>);
53+
static_assert(!std::ranges::enable_view<PublicViewBase&>);
54+
static_assert(!std::ranges::enable_view<PublicViewBase&&>);
55+
static_assert(std::ranges::enable_view<const PublicViewBase>);
56+
static_assert(!std::ranges::enable_view<const PublicViewBase&>);
57+
static_assert(!std::ranges::enable_view<const PublicViewBase&&>);
3958

4059
// Does not derive from view_base, but specializes enable_view to true
4160
struct EnableViewTrue { };
42-
namespace std::ranges { template <> constexpr bool enable_view<EnableViewTrue> = true; }
61+
template <> constexpr bool std::ranges::enable_view<EnableViewTrue> = true;
4362
static_assert(std::ranges::enable_view<EnableViewTrue>);
44-
63+
static_assert(!std::ranges::enable_view<EnableViewTrue&>);
64+
static_assert(!std::ranges::enable_view<EnableViewTrue&&>);
65+
static_assert(!std::ranges::enable_view<const EnableViewTrue>);
66+
static_assert(!std::ranges::enable_view<const EnableViewTrue&>);
67+
static_assert(!std::ranges::enable_view<const EnableViewTrue&&>);
4568

4669
// Make sure that enable_view is a bool, not some other contextually-convertible-to-bool type.
4770
ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<Empty>), const bool);
4871
ASSERT_SAME_TYPE(decltype(std::ranges::enable_view<PublicViewBase>), const bool);
72+
73+
struct V1 : std::ranges::view_interface<V1> {};
74+
static_assert(std::ranges::enable_view<V1>);
75+
static_assert(!std::ranges::enable_view<V1&>);
76+
static_assert(!std::ranges::enable_view<V1&&>);
77+
static_assert(std::ranges::enable_view<const V1>);
78+
static_assert(!std::ranges::enable_view<const V1&>);
79+
static_assert(!std::ranges::enable_view<const V1&&>);
80+
81+
struct V2 : std::ranges::view_interface<V1>, std::ranges::view_interface<V2> {};
82+
static_assert(!std::ranges::enable_view<V2>);
83+
static_assert(!std::ranges::enable_view<V2&>);
84+
static_assert(!std::ranges::enable_view<V2&&>);
85+
static_assert(!std::ranges::enable_view<const V2>);
86+
static_assert(!std::ranges::enable_view<const V2&>);
87+
static_assert(!std::ranges::enable_view<const V2&&>);
88+
89+
struct V3 : std::ranges::view_interface<V1> {};
90+
static_assert(std::ranges::enable_view<V3>);
91+
static_assert(!std::ranges::enable_view<V3&>);
92+
static_assert(!std::ranges::enable_view<V3&&>);
93+
static_assert(std::ranges::enable_view<const V3>);
94+
static_assert(!std::ranges::enable_view<const V3&>);
95+
static_assert(!std::ranges::enable_view<const V3&&>);
96+
97+
struct PrivateInherit : private std::ranges::view_interface<PrivateInherit> {};
98+
static_assert(!std::ranges::enable_view<PrivateInherit>);
99+
100+
// ADL-proof
101+
struct Incomplete;
102+
template<class T> struct Holder { T t; };
103+
static_assert(!std::ranges::enable_view<Holder<Incomplete>*>);
104+
105+
static_assert(!std::ranges::enable_view<void>);

0 commit comments

Comments
 (0)