--- /dev/null
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.osx.cocoa.ObjCGenerics -verify %s
+// XFAIL: *
+
+#if !__has_feature(objc_generics)
+# error Compiler does not support Objective-C generics?
+#endif
+
+#define nil 0
+typedef unsigned long NSUInteger;
+typedef int BOOL;
+
+@protocol NSCopying
+@end
+
+__attribute__((objc_root_class))
+@interface NSObject
+- (void) myFunction:(int*)p myParam:(int) n;
+@end
+
+@interface MyType : NSObject <NSCopying>
+- (void) myFunction:(int*)p myParam:(int) n;
+@end
+
+@interface NSArray<ObjectType> : NSObject
+- (BOOL)contains:(ObjectType)obj;
+- (ObjectType)getObjAtIndex:(NSUInteger)idx;
+- (ObjectType)objectAtIndexedSubscript:(NSUInteger)idx;
+@property(readonly) ObjectType firstObject;
+@end
+
+@implementation NSObject
+- (void) myFunction:(int*)p myParam:(int) n {
+ (void)*p;// no warning
+}
+@end
+
+@implementation MyType
+- (void) myFunction:(int*)p myParam:(int) n {
+ int i = 5/n; // expected-warning {{}}
+ (void)i;
+}
+@end
+
+void testReturnType(NSArray<MyType *> *arr) {
+ NSArray *erased = arr;
+ NSObject *element = [erased firstObject];
+ // TODO: myFunction currently dispatches to NSObject. Make it dispatch to
+ // MyType instead!
+ [element myFunction:0 myParam:0 ];
+}
+
+void testArgument(NSArray<MyType *> *arr, id element) {
+ NSArray *erased = arr;
+ [erased contains: element];
+ // TODO: myFunction currently is not dispatched to MyType. Make it dispatch to
+ // MyType!
+ [element myFunction:0 myParam:0 ];
+}