[libcxx] r296561 - Fix PR32097 - is_abstract doesn't work on class templates.

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Tue Feb 28 17:27:14 PST 2017


Author: ericwf
Date: Tue Feb 28 19:27:14 2017
New Revision: 296561

URL: http://llvm.org/viewvc/llvm-project?rev=296561&view=rev
Log:
Fix PR32097 - is_abstract doesn't work on class templates.

This patch fixes llvm.org/PR32097 by using the __is_abstract
builtin type-trait instead of the previous library-only implementation.

All supported compilers provide this trait. I've tested as far
back as Clang 3.2, GCC 4.6 and MSVC trunk.

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

Modified: libcxx/trunk/include/type_traits
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=296561&r1=296560&r2=296561&view=diff
==============================================================================
--- libcxx/trunk/include/type_traits (original)
+++ libcxx/trunk/include/type_traits Tue Feb 28 19:27:14 2017
@@ -1297,18 +1297,8 @@ template <class _Tp> using decay_t = typ
 
 // is_abstract
 
-namespace __is_abstract_imp
-{
-template <class _Tp> char  __test(_Tp (*)[1]);
-template <class _Tp> __two __test(...);
-}
-
-template <class _Tp, bool = is_class<_Tp>::value>
-struct __libcpp_abstract : public integral_constant<bool, sizeof(__is_abstract_imp::__test<_Tp>(0)) != 1> {};
-
-template <class _Tp> struct __libcpp_abstract<_Tp, false> : public false_type {};
-
-template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_abstract : public __libcpp_abstract<_Tp> {};
+template <class _Tp> struct _LIBCPP_TEMPLATE_VIS is_abstract
+    : public integral_constant<bool, __is_abstract(_Tp)> {};
 
 #if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_VARIABLE_TEMPLATES)
 template <class _Tp> _LIBCPP_CONSTEXPR bool is_abstract_v

Modified: libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.prop/is_abstract.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.prop/is_abstract.pass.cpp?rev=296561&r1=296560&r2=296561&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.prop/is_abstract.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.prop/is_abstract.pass.cpp Tue Feb 28 19:27:14 2017
@@ -65,6 +65,14 @@ class Abstract
     virtual ~Abstract() = 0;
 };
 
+template <class>
+struct AbstractTemplate {
+  virtual void test() = 0;
+};
+
+template <>
+struct AbstractTemplate<double> {};
+
 int main()
 {
     test_is_not_abstract<void>();
@@ -81,4 +89,6 @@ int main()
     test_is_not_abstract<NotEmpty>();
 
     test_is_abstract<Abstract>();
+    test_is_abstract<AbstractTemplate<int> >();
+    test_is_not_abstract<AbstractTemplate<double> >();
 }




More information about the cfe-commits mailing list