1// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.ObjCGenerics -verify %s 2 3#if !__has_feature(objc_generics) 4# error Compiler does not support Objective-C generics? 5#endif 6 7#define nil 0 8typedef unsigned long NSUInteger; 9typedef int BOOL; 10 11@protocol NSCopying 12@end 13 14__attribute__((objc_root_class)) 15@interface NSObject 16- (void) myFunction:(int*)p myParam:(int) n; 17@end 18 19@interface MyType : NSObject <NSCopying> 20- (void) myFunction:(int*)p myParam:(int) n; 21@end 22 23@interface NSArray<ObjectType> : NSObject 24- (BOOL)contains:(ObjectType)obj; 25- (ObjectType)getObjAtIndex:(NSUInteger)idx; 26- (ObjectType)objectAtIndexedSubscript:(NSUInteger)idx; 27@property(readonly) ObjectType firstObject; 28@end 29 30@implementation NSObject 31- (void) myFunction:(int*)p myParam:(int) n { 32 (void)*p;// no warning 33} 34@end 35 36@implementation MyType 37- (void) myFunction:(int*)p myParam:(int) n { 38 int i = 5/n; // expected-warning {{}} 39 (void)i; 40} 41@end 42 43void testReturnType(NSArray<MyType *> *arr) { 44 NSArray *erased = arr; 45 NSObject *element = [erased firstObject]; 46 // TODO: myFunction currently dispatches to NSObject. Make it dispatch to 47 // MyType instead! 48 [element myFunction:0 myParam:0 ]; 49} 50 51void testArgument(NSArray<MyType *> *arr, id element) { 52 NSArray *erased = arr; 53 [erased contains: element]; 54 // TODO: myFunction currently is not dispatched to MyType. Make it dispatch to 55 // MyType! 56 [element myFunction:0 myParam:0 ]; 57} 58