Skip to content

Commit 8970df3

Browse files
committed
[libc++] Simplify the implementation of __is_referenceable
1 parent 979c275 commit 8970df3

File tree

8 files changed

+207
-223
lines changed

8 files changed

+207
-223
lines changed

libcxx/include/__type_traits/add_lvalue_reference.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ using __add_lvalue_reference_t _LIBCPP_NODEBUG = __add_lvalue_reference(_Tp);
2525

2626
#else
2727

28-
template <class _Tp, bool = __libcpp_is_referenceable<_Tp>::value>
28+
template <class _Tp, bool = __is_referenceable_v<_Tp>>
2929
struct __add_lvalue_reference_impl {
3030
using type _LIBCPP_NODEBUG = _Tp;
3131
};

libcxx/include/__type_traits/add_pointer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ template <class _Tp>
2626
using __add_pointer_t _LIBCPP_NODEBUG = __add_pointer(_Tp);
2727

2828
#else
29-
template <class _Tp, bool = __libcpp_is_referenceable<_Tp>::value || is_void<_Tp>::value>
29+
template <class _Tp, bool = __is_referenceable_v<_Tp> || is_void<_Tp>::value>
3030
struct __add_pointer_impl {
3131
using type _LIBCPP_NODEBUG = __libcpp_remove_reference_t<_Tp>*;
3232
};

libcxx/include/__type_traits/add_rvalue_reference.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ using __add_rvalue_reference_t _LIBCPP_NODEBUG = __add_rvalue_reference(_Tp);
2525

2626
#else
2727

28-
template <class _Tp, bool = __libcpp_is_referenceable<_Tp>::value>
28+
template <class _Tp, bool = __is_referenceable_v<_Tp> >
2929
struct __add_rvalue_reference_impl {
3030
using type _LIBCPP_NODEBUG = _Tp;
3131
};

libcxx/include/__type_traits/decay.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ struct _LIBCPP_TEMPLATE_VIS decay {
5555
using _Up _LIBCPP_NODEBUG = __libcpp_remove_reference_t<_Tp>;
5656

5757
public:
58-
using type _LIBCPP_NODEBUG = typename __decay<_Up, __libcpp_is_referenceable<_Up>::value>::type;
58+
using type _LIBCPP_NODEBUG = typename __decay<_Up, __is_referenceable_v<_Up> >::type;
5959
};
6060

6161
template <class _Tp>

libcxx/include/__type_traits/is_referenceable.h

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,19 @@
1010
#define _LIBCPP___TYPE_TRAITS_IS_REFERENCEABLE_H
1111

1212
#include <__config>
13-
#include <__type_traits/integral_constant.h>
14-
#include <__type_traits/is_same.h>
13+
#include <__type_traits/void_t.h>
1514

1615
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1716
# pragma GCC system_header
1817
#endif
1918

2019
_LIBCPP_BEGIN_NAMESPACE_STD
2120

22-
#if __has_builtin(__is_referenceable)
23-
template <class _Tp>
24-
struct __libcpp_is_referenceable : integral_constant<bool, __is_referenceable(_Tp)> {};
25-
#else
26-
struct __libcpp_is_referenceable_impl {
27-
template <class _Tp>
28-
static _Tp& __test(int);
29-
template <class _Tp>
30-
static false_type __test(...);
31-
};
21+
template <class _Tp, class = void>
22+
inline const bool __is_referenceable_v = false;
3223

3324
template <class _Tp>
34-
struct __libcpp_is_referenceable
35-
: integral_constant<bool, _IsNotSame<decltype(__libcpp_is_referenceable_impl::__test<_Tp>(0)), false_type>::value> {
36-
};
37-
#endif // __has_builtin(__is_referenceable)
25+
inline const bool __is_referenceable_v<_Tp, __void_t<_Tp&>> = true;
3826

3927
_LIBCPP_END_NAMESPACE_STD
4028

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
10+
// __is_referenceable_v<Tp>
11+
//
12+
// [defns.referenceable] defines "a referenceable type" as:
13+
// An object type, a function type that does not have cv-qualifiers
14+
// or a ref-qualifier, or a reference type.
15+
//
16+
17+
#include <type_traits>
18+
#include <cassert>
19+
20+
#include "test_macros.h"
21+
22+
struct Foo {};
23+
24+
static_assert((!std::__is_referenceable_v<void>), "");
25+
static_assert((std::__is_referenceable_v<int>), "");
26+
static_assert((std::__is_referenceable_v<int[3]>), "");
27+
static_assert((std::__is_referenceable_v<int[]>), "");
28+
static_assert((std::__is_referenceable_v<int&>), "");
29+
static_assert((std::__is_referenceable_v<const int&>), "");
30+
static_assert((std::__is_referenceable_v<int*>), "");
31+
static_assert((std::__is_referenceable_v<const int*>), "");
32+
static_assert((std::__is_referenceable_v<Foo>), "");
33+
static_assert((std::__is_referenceable_v<const Foo>), "");
34+
static_assert((std::__is_referenceable_v<Foo&>), "");
35+
static_assert((std::__is_referenceable_v<const Foo&>), "");
36+
#if TEST_STD_VER >= 11
37+
static_assert((std::__is_referenceable_v<Foo&&>), "");
38+
static_assert((std::__is_referenceable_v<const Foo&&>), "");
39+
#endif
40+
41+
static_assert((std::__is_referenceable_v<int __attribute__((__vector_size__(8)))>), "");
42+
static_assert((std::__is_referenceable_v<const int __attribute__((__vector_size__(8)))>), "");
43+
static_assert((std::__is_referenceable_v<float __attribute__((__vector_size__(16)))>), "");
44+
static_assert((std::__is_referenceable_v<const float __attribute__((__vector_size__(16)))>), "");
45+
46+
// Functions without cv-qualifiers are referenceable
47+
static_assert((std::__is_referenceable_v<void()>), "");
48+
#if TEST_STD_VER >= 11
49+
static_assert((!std::__is_referenceable_v<void() const>), "");
50+
static_assert((!std::__is_referenceable_v<void() &>), "");
51+
static_assert((!std::__is_referenceable_v<void() const&>), "");
52+
static_assert((!std::__is_referenceable_v<void() &&>), "");
53+
static_assert((!std::__is_referenceable_v<void() const&&>), "");
54+
#endif
55+
56+
static_assert((std::__is_referenceable_v<void(int)>), "");
57+
#if TEST_STD_VER >= 11
58+
static_assert((!std::__is_referenceable_v<void(int) const>), "");
59+
static_assert((!std::__is_referenceable_v<void(int) &>), "");
60+
static_assert((!std::__is_referenceable_v<void(int) const&>), "");
61+
static_assert((!std::__is_referenceable_v<void(int) &&>), "");
62+
static_assert((!std::__is_referenceable_v<void(int) const&&>), "");
63+
#endif
64+
65+
static_assert((std::__is_referenceable_v<void(int, float)>), "");
66+
#if TEST_STD_VER >= 11
67+
static_assert((!std::__is_referenceable_v<void(int, float) const>), "");
68+
static_assert((!std::__is_referenceable_v<void(int, float) &>), "");
69+
static_assert((!std::__is_referenceable_v<void(int, float) const&>), "");
70+
static_assert((!std::__is_referenceable_v<void(int, float) &&>), "");
71+
static_assert((!std::__is_referenceable_v<void(int, float) const&&>), "");
72+
#endif
73+
74+
static_assert((std::__is_referenceable_v<void(int, float, Foo&)>), "");
75+
#if TEST_STD_VER >= 11
76+
static_assert((!std::__is_referenceable_v<void(int, float, Foo&) const>), "");
77+
static_assert((!std::__is_referenceable_v<void(int, float, Foo&) &>), "");
78+
static_assert((!std::__is_referenceable_v<void(int, float, Foo&) const&>), "");
79+
static_assert((!std::__is_referenceable_v<void(int, float, Foo&) &&>), "");
80+
static_assert((!std::__is_referenceable_v<void(int, float, Foo&) const&&>), "");
81+
#endif
82+
83+
static_assert((std::__is_referenceable_v<void(...)>), "");
84+
#if TEST_STD_VER >= 11
85+
static_assert((!std::__is_referenceable_v<void(...) const>), "");
86+
static_assert((!std::__is_referenceable_v<void(...) &>), "");
87+
static_assert((!std::__is_referenceable_v<void(...) const&>), "");
88+
static_assert((!std::__is_referenceable_v<void(...) &&>), "");
89+
static_assert((!std::__is_referenceable_v<void(...) const&&>), "");
90+
#endif
91+
92+
static_assert((std::__is_referenceable_v<void(int, ...)>), "");
93+
#if TEST_STD_VER >= 11
94+
static_assert((!std::__is_referenceable_v<void(int, ...) const>), "");
95+
static_assert((!std::__is_referenceable_v<void(int, ...) &>), "");
96+
static_assert((!std::__is_referenceable_v<void(int, ...) const&>), "");
97+
static_assert((!std::__is_referenceable_v<void(int, ...) &&>), "");
98+
static_assert((!std::__is_referenceable_v<void(int, ...) const&&>), "");
99+
#endif
100+
101+
static_assert((std::__is_referenceable_v<void(int, float, ...)>), "");
102+
#if TEST_STD_VER >= 11
103+
static_assert((!std::__is_referenceable_v<void(int, float, ...) const>), "");
104+
static_assert((!std::__is_referenceable_v<void(int, float, ...) &>), "");
105+
static_assert((!std::__is_referenceable_v<void(int, float, ...) const&>), "");
106+
static_assert((!std::__is_referenceable_v<void(int, float, ...) &&>), "");
107+
static_assert((!std::__is_referenceable_v<void(int, float, ...) const&&>), "");
108+
#endif
109+
110+
static_assert((std::__is_referenceable_v<void(int, float, Foo&, ...)>), "");
111+
#if TEST_STD_VER >= 11
112+
static_assert((!std::__is_referenceable_v<void(int, float, Foo&, ...) const>), "");
113+
static_assert((!std::__is_referenceable_v<void(int, float, Foo&, ...) &>), "");
114+
static_assert((!std::__is_referenceable_v<void(int, float, Foo&, ...) const&>), "");
115+
static_assert((!std::__is_referenceable_v<void(int, float, Foo&, ...) &&>), "");
116+
static_assert((!std::__is_referenceable_v<void(int, float, Foo&, ...) const&&>), "");
117+
#endif
118+
119+
// member functions with or without cv-qualifiers are referenceable
120+
static_assert((std::__is_referenceable_v<void (Foo::*)()>), "");
121+
static_assert((std::__is_referenceable_v<void (Foo::*)() const>), "");
122+
#if TEST_STD_VER >= 11
123+
static_assert((std::__is_referenceable_v<void (Foo::*)() &>), "");
124+
static_assert((std::__is_referenceable_v<void (Foo::*)() const&>), "");
125+
static_assert((std::__is_referenceable_v<void (Foo::*)() &&>), "");
126+
static_assert((std::__is_referenceable_v<void (Foo::*)() const&&>), "");
127+
#endif
128+
129+
static_assert((std::__is_referenceable_v<void (Foo::*)(int)>), "");
130+
static_assert((std::__is_referenceable_v<void (Foo::*)(int) const>), "");
131+
#if TEST_STD_VER >= 11
132+
static_assert((std::__is_referenceable_v<void (Foo::*)(int) &>), "");
133+
static_assert((std::__is_referenceable_v<void (Foo::*)(int) const&>), "");
134+
static_assert((std::__is_referenceable_v<void (Foo::*)(int) &&>), "");
135+
static_assert((std::__is_referenceable_v<void (Foo::*)(int) const&&>), "");
136+
#endif
137+
138+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float)>), "");
139+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float) const>), "");
140+
#if TEST_STD_VER >= 11
141+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float) &>), "");
142+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float) const&>), "");
143+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float) &&>), "");
144+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float) const&&>), "");
145+
#endif
146+
147+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&)>), "");
148+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&) const>), "");
149+
#if TEST_STD_VER >= 11
150+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&) &>), "");
151+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&) const&>), "");
152+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&) &&>), "");
153+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&) const&&>), "");
154+
#endif
155+
156+
static_assert((std::__is_referenceable_v<void (Foo::*)(...)>), "");
157+
static_assert((std::__is_referenceable_v<void (Foo::*)(...) const>), "");
158+
#if TEST_STD_VER >= 11
159+
static_assert((std::__is_referenceable_v<void (Foo::*)(...) &>), "");
160+
static_assert((std::__is_referenceable_v<void (Foo::*)(...) const&>), "");
161+
static_assert((std::__is_referenceable_v<void (Foo::*)(...) &&>), "");
162+
static_assert((std::__is_referenceable_v<void (Foo::*)(...) const&&>), "");
163+
#endif
164+
165+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, ...)>), "");
166+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, ...) const>), "");
167+
#if TEST_STD_VER >= 11
168+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, ...) &>), "");
169+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, ...) const&>), "");
170+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, ...) &&>), "");
171+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, ...) const&&>), "");
172+
#endif
173+
174+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, ...)>), "");
175+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, ...) const>), "");
176+
#if TEST_STD_VER >= 11
177+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, ...) &>), "");
178+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, ...) const&>), "");
179+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, ...) &&>), "");
180+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, ...) const&&>), "");
181+
#endif
182+
183+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&, ...)>), "");
184+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&, ...) const>), "");
185+
#if TEST_STD_VER >= 11
186+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&, ...) &>), "");
187+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&, ...) const&>), "");
188+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&, ...) &&>), "");
189+
static_assert((std::__is_referenceable_v<void (Foo::*)(int, float, Foo&, ...) const&&>), "");
190+
#endif

0 commit comments

Comments
 (0)