소스 검색

has_trivial_copy_constructor hooked up to clang. Filed http://llvm.org/bugs/show_bug.cgi?id=8105 to take care of void, arrays of incomplete bounds and complete bounds which don't work yet. If there is some reason we don't want to handle these types in the compiler, I can handle them in the library.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@113270 91177308-0d34-0410-b5e6-96231b3b80d8
Howard Hinnant 15 년 전
부모
커밋
87eea6d801
3개의 변경된 파일21개의 추가작업 그리고 8개의 파일을 삭제
  1. 3 0
      include/__config
  2. 11 3
      include/type_traits
  3. 7 5
      test/utilities/meta/meta.unary/meta.unary.prop/has_trivial_copy_constructor.pass.cpp

+ 3 - 0
include/__config

@@ -88,7 +88,10 @@
 
 #define _LIBCPP_HAS_NO_ADVANCED_SFINAE
 #define _LIBCPP_HAS_NO_TEMPLATE_ALIASES
+
+#ifndef __GXX_EXPERIMENTAL_CXX0X__
 #define _LIBCPP_HAS_NO_UNICODE_CHARS
+#endif
 
 #if !(__has_feature(cxx_exceptions))
 #define _LIBCPP_NO_EXCEPTIONS

+ 11 - 3
include/type_traits

@@ -728,11 +728,19 @@ template <class _Tp> struct has_nothrow_default_constructor
 
 // has_trivial_copy_constructor
 
-template <class _Tp> struct __has_trivial_copy_constructor : public integral_constant<bool, is_scalar<_Tp>::value ||
-                                                                                is_reference<_Tp>::value> {};
+#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 || defined(__clang__)
+
+template <class _Tp> struct has_trivial_copy_constructor
+    : public integral_constant<bool, __has_trivial_copy(_Tp)> {};
+
+#else  // __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 || defined(__clang__)
 
 template <class _Tp> struct has_trivial_copy_constructor
-    : public __has_trivial_copy_constructor<typename remove_all_extents<_Tp>::type> {};
+    : public integral_constant<bool, is_scalar<_Tp>::value ||
+                                     is_reference<_Tp>::value> {};
+
+
+#endif  // __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 || defined(__clang__)
 
 // has_nothrow_copy_constructor
 

+ 7 - 5
test/utilities/meta/meta.unary/meta.unary.prop/has_trivial_copy_constructor.pass.cpp

@@ -37,6 +37,7 @@ class Empty
 
 class NotEmpty
 {
+public:
     virtual ~NotEmpty();
 };
 
@@ -49,6 +50,7 @@ struct bit_zero
 
 class Abstract
 {
+public:
     virtual ~Abstract() = 0;
 };
 
@@ -61,17 +63,17 @@ int main()
 {
     test_has_not_trivial_copy_constructor<void>();
     test_has_not_trivial_copy_constructor<A>();
-    test_has_not_trivial_copy_constructor<int&>();
+    test_has_not_trivial_copy_constructor<char[3]>();
+    test_has_not_trivial_copy_constructor<char[]>();
+    test_has_not_trivial_copy_constructor<Abstract>();
+    test_has_not_trivial_copy_constructor<NotEmpty>();
 
+    test_has_trivial_copy_constructor<int&>();
     test_has_trivial_copy_constructor<Union>();
-    test_has_trivial_copy_constructor<Abstract>();
     test_has_trivial_copy_constructor<Empty>();
     test_has_trivial_copy_constructor<int>();
     test_has_trivial_copy_constructor<double>();
     test_has_trivial_copy_constructor<int*>();
     test_has_trivial_copy_constructor<const int*>();
-    test_has_trivial_copy_constructor<char[3]>();
-    test_has_trivial_copy_constructor<char[3]>();
-    test_has_trivial_copy_constructor<NotEmpty>();
     test_has_trivial_copy_constructor<bit_zero>();
 }