[libcxx] r276599 - Make std::is_assignable tolerate references to incomplete types.

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Sun Jul 24 19:08:55 PDT 2016


Author: ericwf
Date: Sun Jul 24 21:08:55 2016
New Revision: 276599

URL: http://llvm.org/viewvc/llvm-project?rev=276599&view=rev
Log:
Make std::is_assignable tolerate references to incomplete types.

Modified:
    libcxx/trunk/include/type_traits
    libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp

Modified: libcxx/trunk/include/type_traits
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=276599&r1=276598&r2=276599&view=diff
==============================================================================
--- libcxx/trunk/include/type_traits (original)
+++ libcxx/trunk/include/type_traits Sun Jul 24 21:08:55 2016
@@ -2036,26 +2036,15 @@ template<typename, typename _Tp> struct
 
 template <class _Tp, class _Arg>
 typename __select_2nd<decltype((_VSTD::declval<_Tp>() = _VSTD::declval<_Arg>())), true_type>::type
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-__is_assignable_test(_Tp&&, _Arg&&);
-#else
-__is_assignable_test(_Tp, _Arg&);
-#endif
+__is_assignable_test(int);
+
+template <class, class>
+false_type __is_assignable_test(...);
 
-template <class _Arg>
-false_type
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-__is_assignable_test(__any, _Arg&&);
-#else
-__is_assignable_test(__any, _Arg&);
-#endif
 
 template <class _Tp, class _Arg, bool = is_void<_Tp>::value || is_void<_Arg>::value>
 struct __is_assignable_imp
-    : public common_type
-        <
-            decltype(_VSTD::__is_assignable_test(declval<_Tp>(), declval<_Arg>()))
-        >::type {};
+    : public decltype((_VSTD::__is_assignable_test<_Tp, _Arg>(0))) {};
 
 template <class _Tp, class _Arg>
 struct __is_assignable_imp<_Tp, _Arg, true>

Modified: libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp?rev=276599&r1=276598&r2=276599&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.prop/is_assignable.pass.cpp Sun Jul 24 21:08:55 2016
@@ -43,7 +43,7 @@ void test_is_not_assignable()
 
 struct D;
 
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+#if TEST_STD_VER >= 11
 struct C
 {
     template <class U>
@@ -59,6 +59,8 @@ struct E
 template <typename T>
 struct X { T t; };
 
+struct Incomplete;
+
 int main()
 {
     test_is_assignable<int&, int&> ();
@@ -67,7 +69,7 @@ int main()
     test_is_assignable<B, A> ();
     test_is_assignable<void*&, void*> ();
 
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
+#if TEST_STD_VER >= 11
     test_is_assignable<E, int> ();
 
     test_is_not_assignable<int, int&> ();
@@ -80,4 +82,5 @@ int main()
 
 //  pointer to incomplete template type
 	test_is_assignable<X<D>*&, X<D>*> ();
+    test_is_not_assignable<Incomplete&, Incomplete const&>();
 }




More information about the cfe-commits mailing list