1 // RUN: %clang_cc1 -fsyntax-only -fobjc-arc -fobjc-runtime-has-weak -verify -std=c++11 %s 2 // expected-no-diagnostics 3 4 // Check the results of the various type-trait query functions on 5 // lifetime-qualified types in ARC. 6 7 #define JOIN3(X,Y) X ## Y 8 #define JOIN2(X,Y) JOIN3(X,Y) 9 #define JOIN(X,Y) JOIN2(X,Y) 10 11 #define TRAIT_IS_TRUE(Trait, Type) char JOIN2(Trait,__LINE__)[Trait(Type)? 1 : -1] 12 #define TRAIT_IS_FALSE(Trait, Type) char JOIN2(Trait,__LINE__)[Trait(Type)? -1 : 1] 13 #define TRAIT_IS_TRUE_2(Trait, Type1, Type2) char JOIN2(Trait,__LINE__)[Trait(Type1, Type2)? 1 : -1] 14 #define TRAIT_IS_FALSE_2(Trait, Type1, Type2) char JOIN2(Trait,__LINE__)[Trait(Type1, Type2)? -1 : 1] 15 16 struct HasStrong { id obj; }; 17 struct HasWeak { __weak id obj; }; 18 struct HasUnsafeUnretained { __unsafe_unretained id obj; }; 19 20 // __has_nothrow_assign 21 TRAIT_IS_TRUE(__has_nothrow_assign, __strong id); 22 TRAIT_IS_TRUE(__has_nothrow_assign, __weak id); 23 TRAIT_IS_TRUE(__has_nothrow_assign, __autoreleasing id); 24 TRAIT_IS_TRUE(__has_nothrow_assign, __unsafe_unretained id); 25 TRAIT_IS_TRUE(__has_nothrow_assign, HasStrong); 26 TRAIT_IS_TRUE(__has_nothrow_assign, HasWeak); 27 TRAIT_IS_TRUE(__has_nothrow_assign, HasUnsafeUnretained); 28 29 // __has_nothrow_copy 30 TRAIT_IS_TRUE(__has_nothrow_copy, __strong id); 31 TRAIT_IS_TRUE(__has_nothrow_copy, __weak id); 32 TRAIT_IS_TRUE(__has_nothrow_copy, __autoreleasing id); 33 TRAIT_IS_TRUE(__has_nothrow_copy, __unsafe_unretained id); 34 TRAIT_IS_TRUE(__has_nothrow_copy, HasStrong); 35 TRAIT_IS_TRUE(__has_nothrow_copy, HasWeak); 36 TRAIT_IS_TRUE(__has_nothrow_copy, HasUnsafeUnretained); 37 38 // __has_nothrow_constructor 39 TRAIT_IS_TRUE(__has_nothrow_constructor, __strong id); 40 TRAIT_IS_TRUE(__has_nothrow_constructor, __weak id); 41 TRAIT_IS_TRUE(__has_nothrow_constructor, __autoreleasing id); 42 TRAIT_IS_TRUE(__has_nothrow_constructor, __unsafe_unretained id); 43 TRAIT_IS_TRUE(__has_nothrow_constructor, HasStrong); 44 TRAIT_IS_TRUE(__has_nothrow_constructor, HasWeak); 45 TRAIT_IS_TRUE(__has_nothrow_constructor, HasUnsafeUnretained); 46 47 // __has_trivial_assign 48 TRAIT_IS_FALSE(__has_trivial_assign, __strong id); 49 TRAIT_IS_FALSE(__has_trivial_assign, __weak id); 50 TRAIT_IS_FALSE(__has_trivial_assign, __autoreleasing id); 51 TRAIT_IS_TRUE(__has_trivial_assign, __unsafe_unretained id); 52 TRAIT_IS_FALSE(__has_trivial_assign, HasStrong); 53 TRAIT_IS_FALSE(__has_trivial_assign, HasWeak); 54 TRAIT_IS_TRUE(__has_trivial_assign, HasUnsafeUnretained); 55 56 // __has_trivial_copy 57 TRAIT_IS_FALSE(__has_trivial_copy, __strong id); 58 TRAIT_IS_FALSE(__has_trivial_copy, __weak id); 59 TRAIT_IS_FALSE(__has_trivial_copy, __autoreleasing id); 60 TRAIT_IS_TRUE(__has_trivial_copy, __unsafe_unretained id); 61 TRAIT_IS_FALSE(__has_trivial_copy, HasStrong); 62 TRAIT_IS_FALSE(__has_trivial_copy, HasWeak); 63 TRAIT_IS_TRUE(__has_trivial_copy, HasUnsafeUnretained); 64 65 // __has_trivial_constructor 66 TRAIT_IS_FALSE(__has_trivial_constructor, __strong id); 67 TRAIT_IS_FALSE(__has_trivial_constructor, __weak id); 68 TRAIT_IS_FALSE(__has_trivial_constructor, __autoreleasing id); 69 TRAIT_IS_TRUE(__has_trivial_constructor, __unsafe_unretained id); 70 TRAIT_IS_FALSE(__has_trivial_constructor, HasStrong); 71 TRAIT_IS_FALSE(__has_trivial_constructor, HasWeak); 72 TRAIT_IS_TRUE(__has_trivial_constructor, HasUnsafeUnretained); 73 74 // __has_trivial_destructor 75 TRAIT_IS_FALSE(__has_trivial_destructor, __strong id); 76 TRAIT_IS_FALSE(__has_trivial_destructor, __weak id); 77 TRAIT_IS_TRUE(__has_trivial_destructor, __autoreleasing id); 78 TRAIT_IS_TRUE(__has_trivial_destructor, __unsafe_unretained id); 79 TRAIT_IS_FALSE(__has_trivial_destructor, HasStrong); 80 TRAIT_IS_FALSE(__has_trivial_destructor, HasWeak); 81 TRAIT_IS_TRUE(__has_trivial_destructor, HasUnsafeUnretained); 82 83 // __is_literal 84 TRAIT_IS_TRUE(__is_literal, __strong id); 85 TRAIT_IS_TRUE(__is_literal, __weak id); 86 TRAIT_IS_TRUE(__is_literal, __autoreleasing id); 87 TRAIT_IS_TRUE(__is_literal, __unsafe_unretained id); 88 89 // __is_literal_type 90 TRAIT_IS_TRUE(__is_literal_type, __strong id); 91 TRAIT_IS_TRUE(__is_literal_type, __weak id); 92 TRAIT_IS_TRUE(__is_literal_type, __autoreleasing id); 93 TRAIT_IS_TRUE(__is_literal_type, __unsafe_unretained id); 94 95 // __is_pod 96 TRAIT_IS_FALSE(__is_pod, __strong id); 97 TRAIT_IS_FALSE(__is_pod, __weak id); 98 TRAIT_IS_FALSE(__is_pod, __autoreleasing id); 99 TRAIT_IS_TRUE(__is_pod, __unsafe_unretained id); 100 TRAIT_IS_FALSE(__is_pod, HasStrong); 101 TRAIT_IS_FALSE(__is_pod, HasWeak); 102 TRAIT_IS_TRUE(__is_pod, HasUnsafeUnretained); 103 104 // __is_trivial 105 TRAIT_IS_FALSE(__is_trivial, __strong id); 106 TRAIT_IS_FALSE(__is_trivial, __weak id); 107 TRAIT_IS_FALSE(__is_trivial, __autoreleasing id); 108 TRAIT_IS_TRUE(__is_trivial, __unsafe_unretained id); 109 TRAIT_IS_FALSE(__is_trivial, HasStrong); 110 TRAIT_IS_FALSE(__is_trivial, HasWeak); 111 TRAIT_IS_TRUE(__is_trivial, HasUnsafeUnretained); 112 113 // __is_scalar 114 TRAIT_IS_FALSE(__is_scalar, __strong id); 115 TRAIT_IS_FALSE(__is_scalar, __weak id); 116 TRAIT_IS_FALSE(__is_scalar, __autoreleasing id); 117 TRAIT_IS_TRUE(__is_scalar, __unsafe_unretained id); 118 119 // __is_standard_layout 120 TRAIT_IS_TRUE(__is_standard_layout, __strong id); 121 TRAIT_IS_TRUE(__is_standard_layout, __weak id); 122 TRAIT_IS_TRUE(__is_standard_layout, __autoreleasing id); 123 TRAIT_IS_TRUE(__is_standard_layout, __unsafe_unretained id); 124 125 // __is_trivally_assignable 126 TRAIT_IS_FALSE_2(__is_trivially_assignable, __strong id&, __strong id); 127 TRAIT_IS_FALSE_2(__is_trivially_assignable, __strong id&, __weak id); 128 TRAIT_IS_FALSE_2(__is_trivially_assignable, __strong id&, __autoreleasing id); 129 TRAIT_IS_FALSE_2(__is_trivially_assignable, __strong id&, __unsafe_unretained id); 130 TRAIT_IS_FALSE_2(__is_trivially_assignable, __strong id&, __strong id&&); 131 TRAIT_IS_FALSE_2(__is_trivially_assignable, __strong id&, __weak id&&); 132 TRAIT_IS_FALSE_2(__is_trivially_assignable, __strong id&, __autoreleasing id&&); 133 TRAIT_IS_FALSE_2(__is_trivially_assignable, __strong id&, __unsafe_unretained id&&); 134 TRAIT_IS_FALSE_2(__is_trivially_assignable, __weak id&, __strong id); 135 TRAIT_IS_FALSE_2(__is_trivially_assignable, __weak id&, __weak id); 136 TRAIT_IS_FALSE_2(__is_trivially_assignable, __weak id&, __autoreleasing id); 137 TRAIT_IS_FALSE_2(__is_trivially_assignable, __weak id&, __unsafe_unretained id); 138 TRAIT_IS_FALSE_2(__is_trivially_assignable, __weak id&, __strong id&&); 139 TRAIT_IS_FALSE_2(__is_trivially_assignable, __weak id&, __weak id&&); 140 TRAIT_IS_FALSE_2(__is_trivially_assignable, __weak id&, __autoreleasing id&&); 141 TRAIT_IS_FALSE_2(__is_trivially_assignable, __weak id&, __unsafe_unretained id&&); 142 143 TRAIT_IS_FALSE_2(__is_trivially_assignable, __autoreleasing id&, __strong id); 144 TRAIT_IS_FALSE_2(__is_trivially_assignable, __autoreleasing id&, __weak id); 145 TRAIT_IS_FALSE_2(__is_trivially_assignable, __autoreleasing id&, __autoreleasing id); 146 TRAIT_IS_FALSE_2(__is_trivially_assignable, __autoreleasing id&, __unsafe_unretained id); 147 TRAIT_IS_FALSE_2(__is_trivially_assignable, __autoreleasing id&, __strong id&&); 148 TRAIT_IS_FALSE_2(__is_trivially_assignable, __autoreleasing id&, __weak id&&); 149 TRAIT_IS_FALSE_2(__is_trivially_assignable, __autoreleasing id&, __autoreleasing id&&); 150 TRAIT_IS_FALSE_2(__is_trivially_assignable, __autoreleasing id&, __unsafe_unretained id&&); 151 152 TRAIT_IS_TRUE_2(__is_trivially_assignable, __unsafe_unretained id&, __strong id); 153 TRAIT_IS_TRUE_2(__is_trivially_assignable, __unsafe_unretained id&, __weak id); 154 TRAIT_IS_TRUE_2(__is_trivially_assignable, __unsafe_unretained id&, __autoreleasing id); 155 TRAIT_IS_TRUE_2(__is_trivially_assignable, __unsafe_unretained id&, __unsafe_unretained id); 156 TRAIT_IS_TRUE_2(__is_trivially_assignable, __unsafe_unretained id&, __strong id&&); 157 TRAIT_IS_TRUE_2(__is_trivially_assignable, __unsafe_unretained id&, __weak id&&); 158 TRAIT_IS_TRUE_2(__is_trivially_assignable, __unsafe_unretained id&, __autoreleasing id&&); 159 TRAIT_IS_TRUE_2(__is_trivially_assignable, __unsafe_unretained id&, __unsafe_unretained id&&); 160 161 TRAIT_IS_FALSE_2(__is_trivially_assignable, HasStrong&, HasStrong); 162 TRAIT_IS_FALSE_2(__is_trivially_assignable, HasStrong&, HasStrong&&); 163 TRAIT_IS_FALSE_2(__is_trivially_assignable, HasWeak&, HasWeak); 164 TRAIT_IS_FALSE_2(__is_trivially_assignable, HasWeak&, HasWeak&&); 165 TRAIT_IS_TRUE_2(__is_trivially_assignable, HasUnsafeUnretained&, HasUnsafeUnretained); 166 TRAIT_IS_TRUE_2(__is_trivially_assignable, HasUnsafeUnretained&, HasUnsafeUnretained&&); 167 168 // __is_trivally_constructible 169 TRAIT_IS_FALSE(__is_trivially_constructible, __strong id); 170 TRAIT_IS_FALSE(__is_trivially_constructible, __weak id); 171 TRAIT_IS_FALSE(__is_trivially_constructible, __autoreleasing id); 172 TRAIT_IS_TRUE(__is_trivially_constructible, __unsafe_unretained id); 173 174 TRAIT_IS_FALSE_2(__is_trivially_constructible, __strong id, __strong id); 175 TRAIT_IS_FALSE_2(__is_trivially_constructible, __strong id, __weak id); 176 TRAIT_IS_FALSE_2(__is_trivially_constructible, __strong id, __autoreleasing id); 177 TRAIT_IS_FALSE_2(__is_trivially_constructible, __strong id, __unsafe_unretained id); 178 TRAIT_IS_FALSE_2(__is_trivially_constructible, __strong id, __strong id&&); 179 TRAIT_IS_FALSE_2(__is_trivially_constructible, __strong id, __weak id&&); 180 TRAIT_IS_FALSE_2(__is_trivially_constructible, __strong id, __autoreleasing id&&); 181 TRAIT_IS_FALSE_2(__is_trivially_constructible, __strong id, __unsafe_unretained id&&); 182 TRAIT_IS_FALSE_2(__is_trivially_constructible, __weak id, __strong id); 183 TRAIT_IS_FALSE_2(__is_trivially_constructible, __weak id, __weak id); 184 TRAIT_IS_FALSE_2(__is_trivially_constructible, __weak id, __autoreleasing id); 185 TRAIT_IS_FALSE_2(__is_trivially_constructible, __weak id, __unsafe_unretained id); 186 TRAIT_IS_FALSE_2(__is_trivially_constructible, __weak id, __strong id&&); 187 TRAIT_IS_FALSE_2(__is_trivially_constructible, __weak id, __weak id&&); 188 TRAIT_IS_FALSE_2(__is_trivially_constructible, __weak id, __autoreleasing id&&); 189 TRAIT_IS_FALSE_2(__is_trivially_constructible, __weak id, __unsafe_unretained id&&); 190 191 TRAIT_IS_FALSE_2(__is_trivially_constructible, __autoreleasing id, __strong id); 192 TRAIT_IS_FALSE_2(__is_trivially_constructible, __autoreleasing id, __weak id); 193 TRAIT_IS_FALSE_2(__is_trivially_constructible, __autoreleasing id, __autoreleasing id); 194 TRAIT_IS_FALSE_2(__is_trivially_constructible, __autoreleasing id, __unsafe_unretained id); 195 TRAIT_IS_FALSE_2(__is_trivially_constructible, __autoreleasing id, __strong id&&); 196 TRAIT_IS_FALSE_2(__is_trivially_constructible, __autoreleasing id, __weak id&&); 197 TRAIT_IS_FALSE_2(__is_trivially_constructible, __autoreleasing id, __autoreleasing id&&); 198 TRAIT_IS_FALSE_2(__is_trivially_constructible, __autoreleasing id, __unsafe_unretained id&&); 199 200 TRAIT_IS_TRUE_2(__is_trivially_constructible, __unsafe_unretained id, __strong id); 201 TRAIT_IS_TRUE_2(__is_trivially_constructible, __unsafe_unretained id, __weak id); 202 TRAIT_IS_TRUE_2(__is_trivially_constructible, __unsafe_unretained id, __autoreleasing id); 203 TRAIT_IS_TRUE_2(__is_trivially_constructible, __unsafe_unretained id, __unsafe_unretained id); 204 TRAIT_IS_TRUE_2(__is_trivially_constructible, __unsafe_unretained id, __strong id&&); 205 TRAIT_IS_TRUE_2(__is_trivially_constructible, __unsafe_unretained id, __weak id&&); 206 TRAIT_IS_TRUE_2(__is_trivially_constructible, __unsafe_unretained id, __autoreleasing id&&); 207 TRAIT_IS_TRUE_2(__is_trivially_constructible, __unsafe_unretained id, __unsafe_unretained id&&); 208 209 TRAIT_IS_FALSE_2(__is_trivially_constructible, HasStrong, HasStrong); 210 TRAIT_IS_FALSE_2(__is_trivially_constructible, HasStrong, HasStrong&&); 211 TRAIT_IS_FALSE_2(__is_trivially_constructible, HasWeak, HasWeak); 212 TRAIT_IS_FALSE_2(__is_trivially_constructible, HasWeak, HasWeak&&); 213 TRAIT_IS_TRUE_2(__is_trivially_constructible, HasUnsafeUnretained, HasUnsafeUnretained); 214 TRAIT_IS_TRUE_2(__is_trivially_constructible, HasUnsafeUnretained, HasUnsafeUnretained&&); 215 216