#if __has_feature(is_convertible_to) && !defined(_LIBCPP_USE_IS_CONVERTIBLE_FALLBACK)
template <class _T1, class _T2> struct _LIBCPP_TEMPLATE_VIS is_convertible
- : public integral_constant<bool, __is_convertible_to(_T1, _T2) &&
- !is_abstract<_T2>::value> {};
+ : public integral_constant<bool, __is_convertible_to(_T1, _T2)> {};
#else // __has_feature(is_convertible_to)
enum { X = T::ThisExpressionWillBlowUp };
};
+struct abstract { virtual int f() = 0; };
+
int main(int, char**)
{
// void
static_assert((std::is_convertible<volatile NonCopyable&, const volatile NonCopyable&>::value), "");
static_assert((std::is_convertible<const volatile NonCopyable&, const volatile NonCopyable&>::value), "");
static_assert((!std::is_convertible<const NonCopyable&, NonCopyable&>::value), "");
-// This test requires Access control SFINAE which we only have in C++11 or when
-// we are using the compiler builtin for is_convertible.
+
+ // This test requires Access control SFINAE which we only have in C++11 or when
+ // we are using the compiler builtin for is_convertible.
test_is_not_convertible<NonCopyable&, NonCopyable>();
// For example CannotInstantiate is instantiated as a part of ADL lookup for arguments of type CannotInstantiate*.
static_assert((std::is_convertible<CannotInstantiate<int>*, CannotInstantiate<int>*>::value), "");
- return 0;
+ // Test for PR13592
+ static_assert(!std::is_convertible<abstract, abstract>::value, "");
+
+ return 0;
}