summaryrefslogtreecommitdiffstats
path: root/test/SemaObjC/kindof.m
diff options
context:
space:
mode:
authorJordan Rupprecht <rupprecht@google.com>2019-05-14 21:58:59 +0000
committerJordan Rupprecht <rupprecht@google.com>2019-05-14 21:58:59 +0000
commitb35a2aa71f76a334a9c98c0a3c3995b5d902d2b9 (patch)
treecdff4a5d1a715d4ad622fd8f190128b54bebe440 /test/SemaObjC/kindof.m
parent3748d41833787fcbf59cc5624e8d2b042a8991bc (diff)
parent741e05796da92b46d4f7bcbee00702ff37df6489 (diff)
Creating branches/google/stable and tags/google/stable/2019-05-14 from r360103upstream/google/stable
git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/google/stable@360714 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaObjC/kindof.m')
-rw-r--r--test/SemaObjC/kindof.m52
1 files changed, 52 insertions, 0 deletions
diff --git a/test/SemaObjC/kindof.m b/test/SemaObjC/kindof.m
index 9d758d3cfb..b2c3205182 100644
--- a/test/SemaObjC/kindof.m
+++ b/test/SemaObjC/kindof.m
@@ -384,9 +384,17 @@ void testNullability() {
}
@end
+// ---------------------------------------------------------------------------
+// __kindof on type parameters
+// ---------------------------------------------------------------------------
+
@interface NSGeneric<ObjectType> : NSObject
- (void)test:(__kindof ObjectType)T; // expected-note{{passing argument to parameter 'T' here}}
- (void)mapUsingBlock:(id (^)(__kindof ObjectType))block;
+@property (copy) ObjectType object;
+@property (copy) __kindof ObjectType kindof_object;
+
+@property (copy) __kindof ObjectType _Nonnull nonnull_kindof_object;
@end
@implementation NSGeneric
- (void)test:(id)T {
@@ -395,6 +403,11 @@ void testNullability() {
}
@end
+@interface NSDefaultGeneric<ObjectType : NSString *> : NSObject
+@property (copy) ObjectType object;
+@property (copy) __kindof ObjectType kindof_object;
+@end
+
void testGeneric(NSGeneric<NSString*> *generic) {
NSObject *NSObject_obj;
// Assign from NSObject_obj to __kindof NSString*.
@@ -403,6 +416,45 @@ void testGeneric(NSGeneric<NSString*> *generic) {
[generic test:NSString_str];
}
+void testGenericAssignment() {
+ NSMutableString *NSMutableString_str;
+ NSNumber *NSNumber_obj;
+
+ NSGeneric<NSString*> *generic;
+ NSMutableString_str = generic.object; // expected-warning{{incompatible pointer types}}
+ NSNumber_obj = generic.object; // expected-warning{{incompatible pointer types}}
+ NSMutableString_str = generic.kindof_object;
+ NSNumber_obj = generic.kindof_object; // expected-warning{{incompatible pointer types assigning to 'NSNumber *' from '__kindof NSString *'}}
+
+ NSGeneric<__kindof NSString*> *kindof_generic;
+ NSMutableString_str = kindof_generic.object;
+ NSNumber_obj = kindof_generic.object; // expected-warning{{incompatible pointer types assigning to 'NSNumber *' from '__kindof NSString *'}}
+ NSMutableString_str = kindof_generic.kindof_object;
+ NSNumber_obj = kindof_generic.kindof_object; // expected-warning{{incompatible pointer types assigning to 'NSNumber *' from '__kindof __kindof NSString *'}}
+
+ NSDefaultGeneric *default_generic;
+ NSMutableString_str = default_generic.object;
+ NSNumber_obj = default_generic.object; // expected-warning{{incompatible pointer types}}
+ NSMutableString_str = default_generic.kindof_object;
+ NSNumber_obj = default_generic.kindof_object; // expected-warning{{incompatible pointer types assigning to 'NSNumber *' from '__kindof __kindof NSString *'}}
+
+ typedef NSString *Typedef_NSString;
+ NSGeneric<Typedef_NSString> *typedef_generic;
+ NSMutableString_str = typedef_generic.object; // expected-warning{{incompatible pointer types}}
+ NSNumber_obj = typedef_generic.object; // expected-warning{{incompatible pointer types}}
+ NSMutableString_str = typedef_generic.kindof_object;
+ NSNumber_obj = typedef_generic.kindof_object; // expected-warning{{incompatible pointer types assigning to 'NSNumber *' from '__kindof Typedef_NSString'}}
+}
+
+void testKindofNonObjectType() {
+ typedef void (^BlockType)(int);
+ NSGeneric<BlockType> *generic;
+}
+
+void testKindofNullability(NSGeneric<NSString*> *generic) {
+ generic.nonnull_kindof_object = 0; // expected-warning{{null passed to a callee that requires a non-null argument}}
+}
+
// Check that clang doesn't crash when a type parameter is illegal.
@interface Array1<T> : NSObject
@end