summaryrefslogtreecommitdiffstats
path: root/libcxx
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx')
-rw-r--r--libcxx/include/type_traits33
-rw-r--r--libcxx/test/libcxx/utilities/meta/is_referenceable.pass.cpp5
2 files changed, 12 insertions, 26 deletions
diff --git a/libcxx/include/type_traits b/libcxx/include/type_traits
index b0675e1ad1b..33124d2e21d 100644
--- a/libcxx/include/type_traits
+++ b/libcxx/include/type_traits
@@ -959,34 +959,15 @@ template <class _Tp> _LIBCPP_CONSTEXPR bool is_compound_v
// __is_referenceable [defns.referenceable]
-template <class _Tp> struct __is_referenceable
- : public std::integral_constant<bool, is_object<_Tp>::value || is_reference<_Tp>::value> {};
-#ifndef _LIBCPP_HAS_NO_VARIADICS
-template <class _Ret, class... _Args>
-struct __is_referenceable<_Ret(_Args...)> : public std::true_type {};
+struct __is_referenceable_impl {
+ template <class _Tp> static _Tp& __test(int);
+ template <class _Tp> static __two __test(...);
+};
-template <class _Ret, class... _Args>
-struct __is_referenceable<_Ret(_Args..., ...)> : public std::true_type {};
-#else
-template <class _Ret>
-struct __is_referenceable<_Ret()> : public std::true_type {};
-template <class _Ret, class _A0>
-struct __is_referenceable<_Ret(_A0)> : public std::true_type {};
-template <class _Ret, class _A0, class _A1>
-struct __is_referenceable<_Ret(_A0, _A1)> : public std::true_type {};
-template <class _Ret, class _A0, class _A1, class _A2>
-struct __is_referenceable<_Ret(_A0, _A1, _A2)> : public std::true_type {};
-
-template <class _Ret>
-struct __is_referenceable<_Ret(...)> : public std::true_type {};
-template <class _Ret, class _A0>
-struct __is_referenceable<_Ret(_A0, ...)> : public std::true_type {};
-template <class _Ret, class _A0, class _A1>
-struct __is_referenceable<_Ret(_A0, _A1, ...)> : public std::true_type {};
-template <class _Ret, class _A0, class _A1, class _A2>
-struct __is_referenceable<_Ret(_A0, _A1, _A2, ...)> : public std::true_type {};
-#endif
+template <class _Tp>
+struct __is_referenceable : std::integral_constant<bool,
+ !std::is_same<decltype(__is_referenceable_impl::__test<_Tp>(0)), __two>::value> {};
// add_const
diff --git a/libcxx/test/libcxx/utilities/meta/is_referenceable.pass.cpp b/libcxx/test/libcxx/utilities/meta/is_referenceable.pass.cpp
index f42011d954f..dd31ab5a33d 100644
--- a/libcxx/test/libcxx/utilities/meta/is_referenceable.pass.cpp
+++ b/libcxx/test/libcxx/utilities/meta/is_referenceable.pass.cpp
@@ -39,6 +39,11 @@ static_assert(( std::__is_referenceable<Foo &&>::value), "");
static_assert(( std::__is_referenceable<const Foo &&>::value), "");
#endif
+static_assert(( std::__is_referenceable<int __attribute__((__vector_size__( 8)))>::value), "");
+static_assert(( std::__is_referenceable<const int __attribute__((__vector_size__( 8)))>::value), "");
+static_assert(( std::__is_referenceable<float __attribute__((__vector_size__(16)))>::value), "");
+static_assert(( std::__is_referenceable<const float __attribute__((__vector_size__(16)))>::value), "");
+
// Functions without cv-qualifiers are referenceable
static_assert(( std::__is_referenceable<void ()>::value), "");
#if TEST_STD_VER >= 11
OpenPOWER on IntegriCloud