diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-07-23 04:23:39 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-07-23 04:23:39 +0000 |
commit | 3fe52ff7df93f7a928a15cc2cbf5134fdc0cec15 (patch) | |
tree | 71260e934d593f44310db3b68bbaee61905be5a0 /test/SemaObjCXX | |
parent | adb1d4c18ee83249d4cffc99ef902f98e846092a (diff) | |
download | clang-3fe52ff7df93f7a928a15cc2cbf5134fdc0cec15.tar.gz |
When we have an Objective-C object with non-trivial lifetime in a
structor class under ARC, that struct/class does not have a trivial
move constructor or move assignment operator. Fixes the rest of
<rdar://problem/11738725>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160615 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaObjCXX')
-rw-r--r-- | test/SemaObjCXX/arc-type-traits.mm | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/test/SemaObjCXX/arc-type-traits.mm b/test/SemaObjCXX/arc-type-traits.mm index 817724caf2..67bab00cf9 100644 --- a/test/SemaObjCXX/arc-type-traits.mm +++ b/test/SemaObjCXX/arc-type-traits.mm @@ -12,47 +12,72 @@ #define TRAIT_IS_TRUE_2(Trait, Type1, Type2) char JOIN2(Trait,__LINE__)[Trait(Type1, Type2)? 1 : -1] #define TRAIT_IS_FALSE_2(Trait, Type1, Type2) char JOIN2(Trait,__LINE__)[Trait(Type1, Type2)? -1 : 1] +struct HasStrong { id obj; }; +struct HasWeak { __weak id obj; }; +struct HasUnsafeUnretained { __unsafe_unretained id obj; }; + // __has_nothrow_assign TRAIT_IS_TRUE(__has_nothrow_assign, __strong id); TRAIT_IS_TRUE(__has_nothrow_assign, __weak id); TRAIT_IS_TRUE(__has_nothrow_assign, __autoreleasing id); TRAIT_IS_TRUE(__has_nothrow_assign, __unsafe_unretained id); +TRAIT_IS_TRUE(__has_nothrow_assign, HasStrong); +TRAIT_IS_TRUE(__has_nothrow_assign, HasWeak); +TRAIT_IS_TRUE(__has_nothrow_assign, HasUnsafeUnretained); // __has_nothrow_copy TRAIT_IS_TRUE(__has_nothrow_copy, __strong id); TRAIT_IS_TRUE(__has_nothrow_copy, __weak id); TRAIT_IS_TRUE(__has_nothrow_copy, __autoreleasing id); TRAIT_IS_TRUE(__has_nothrow_copy, __unsafe_unretained id); +TRAIT_IS_TRUE(__has_nothrow_copy, HasStrong); +TRAIT_IS_TRUE(__has_nothrow_copy, HasWeak); +TRAIT_IS_TRUE(__has_nothrow_copy, HasUnsafeUnretained); // __has_nothrow_constructor TRAIT_IS_TRUE(__has_nothrow_constructor, __strong id); TRAIT_IS_TRUE(__has_nothrow_constructor, __weak id); TRAIT_IS_TRUE(__has_nothrow_constructor, __autoreleasing id); TRAIT_IS_TRUE(__has_nothrow_constructor, __unsafe_unretained id); +TRAIT_IS_TRUE(__has_nothrow_constructor, HasStrong); +TRAIT_IS_TRUE(__has_nothrow_constructor, HasWeak); +TRAIT_IS_TRUE(__has_nothrow_constructor, HasUnsafeUnretained); // __has_trivial_assign TRAIT_IS_FALSE(__has_trivial_assign, __strong id); TRAIT_IS_FALSE(__has_trivial_assign, __weak id); TRAIT_IS_FALSE(__has_trivial_assign, __autoreleasing id); TRAIT_IS_TRUE(__has_trivial_assign, __unsafe_unretained id); +TRAIT_IS_FALSE(__has_trivial_assign, HasStrong); +TRAIT_IS_FALSE(__has_trivial_assign, HasWeak); +TRAIT_IS_TRUE(__has_trivial_assign, HasUnsafeUnretained); // __has_trivial_copy TRAIT_IS_FALSE(__has_trivial_copy, __strong id); TRAIT_IS_FALSE(__has_trivial_copy, __weak id); TRAIT_IS_FALSE(__has_trivial_copy, __autoreleasing id); TRAIT_IS_TRUE(__has_trivial_copy, __unsafe_unretained id); +TRAIT_IS_FALSE(__has_trivial_copy, HasStrong); +TRAIT_IS_FALSE(__has_trivial_copy, HasWeak); +TRAIT_IS_TRUE(__has_trivial_copy, HasUnsafeUnretained); // __has_trivial_constructor TRAIT_IS_FALSE(__has_trivial_constructor, __strong id); TRAIT_IS_FALSE(__has_trivial_constructor, __weak id); TRAIT_IS_FALSE(__has_trivial_constructor, __autoreleasing id); TRAIT_IS_TRUE(__has_trivial_constructor, __unsafe_unretained id); +TRAIT_IS_FALSE(__has_trivial_constructor, HasStrong); +TRAIT_IS_FALSE(__has_trivial_constructor, HasWeak); +TRAIT_IS_TRUE(__has_trivial_constructor, HasUnsafeUnretained); // __has_trivial_destructor TRAIT_IS_FALSE(__has_trivial_destructor, __strong id); TRAIT_IS_FALSE(__has_trivial_destructor, __weak id); TRAIT_IS_TRUE(__has_trivial_destructor, __autoreleasing id); TRAIT_IS_TRUE(__has_trivial_destructor, __unsafe_unretained id); +TRAIT_IS_FALSE(__has_trivial_destructor, HasStrong); +TRAIT_IS_FALSE(__has_trivial_destructor, HasWeak); +TRAIT_IS_TRUE(__has_trivial_destructor, HasUnsafeUnretained); // __is_literal TRAIT_IS_TRUE(__is_literal, __strong id); @@ -71,12 +96,18 @@ TRAIT_IS_FALSE(__is_pod, __strong id); TRAIT_IS_FALSE(__is_pod, __weak id); TRAIT_IS_FALSE(__is_pod, __autoreleasing id); TRAIT_IS_TRUE(__is_pod, __unsafe_unretained id); +TRAIT_IS_FALSE(__is_pod, HasStrong); +TRAIT_IS_FALSE(__is_pod, HasWeak); +TRAIT_IS_TRUE(__is_pod, HasUnsafeUnretained); // __is_trivial TRAIT_IS_FALSE(__is_trivial, __strong id); TRAIT_IS_FALSE(__is_trivial, __weak id); TRAIT_IS_FALSE(__is_trivial, __autoreleasing id); TRAIT_IS_TRUE(__is_trivial, __unsafe_unretained id); +TRAIT_IS_FALSE(__is_trivial, HasStrong); +TRAIT_IS_FALSE(__is_trivial, HasWeak); +TRAIT_IS_TRUE(__is_trivial, HasUnsafeUnretained); // __is_scalar TRAIT_IS_FALSE(__is_scalar, __strong id); @@ -126,6 +157,13 @@ TRAIT_IS_TRUE_2(__is_trivially_assignable, __unsafe_unretained id&, __weak id&&) TRAIT_IS_TRUE_2(__is_trivially_assignable, __unsafe_unretained id&, __autoreleasing id&&); TRAIT_IS_TRUE_2(__is_trivially_assignable, __unsafe_unretained id&, __unsafe_unretained id&&); +TRAIT_IS_FALSE_2(__is_trivially_assignable, HasStrong&, HasStrong); +TRAIT_IS_FALSE_2(__is_trivially_assignable, HasStrong&, HasStrong&&); +TRAIT_IS_FALSE_2(__is_trivially_assignable, HasWeak&, HasWeak); +TRAIT_IS_FALSE_2(__is_trivially_assignable, HasWeak&, HasWeak&&); +TRAIT_IS_TRUE_2(__is_trivially_assignable, HasUnsafeUnretained&, HasUnsafeUnretained); +TRAIT_IS_TRUE_2(__is_trivially_assignable, HasUnsafeUnretained&, HasUnsafeUnretained&&); + // __is_trivally_constructible TRAIT_IS_FALSE(__is_trivially_constructible, __strong id); TRAIT_IS_FALSE(__is_trivially_constructible, __weak id); @@ -167,3 +205,10 @@ TRAIT_IS_TRUE_2(__is_trivially_constructible, __unsafe_unretained id, __weak id& TRAIT_IS_TRUE_2(__is_trivially_constructible, __unsafe_unretained id, __autoreleasing id&&); TRAIT_IS_TRUE_2(__is_trivially_constructible, __unsafe_unretained id, __unsafe_unretained id&&); +TRAIT_IS_FALSE_2(__is_trivially_constructible, HasStrong, HasStrong); +TRAIT_IS_FALSE_2(__is_trivially_constructible, HasStrong, HasStrong&&); +TRAIT_IS_FALSE_2(__is_trivially_constructible, HasWeak, HasWeak); +TRAIT_IS_FALSE_2(__is_trivially_constructible, HasWeak, HasWeak&&); +TRAIT_IS_TRUE_2(__is_trivially_constructible, HasUnsafeUnretained, HasUnsafeUnretained); +TRAIT_IS_TRUE_2(__is_trivially_constructible, HasUnsafeUnretained, HasUnsafeUnretained&&); + |