| // RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.cocoa.ObjCGenerics -verify %s | |
| #if !__has_feature(objc_generics) | |
| # error Compiler does not support Objective-C generics? | |
| #endif | |
| typedef __typeof(sizeof(int)) size_t; | |
| void *memset(void *, int, size_t); | |
| #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 | |
| - (void) init; | |
| - (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 ]; | |
| } | |
| // Do not try this at home! The analyzer shouldn't crash though when it | |
| // tries to figure out the dynamic type behind the alloca's return value. | |
| void testAlloca(size_t NSArrayClassSizeWeKnowSomehow) { | |
| NSArray *arr = __builtin_alloca(NSArrayClassSizeWeKnowSomehow); | |
| memset(arr, 0, NSArrayClassSizeWeKnowSomehow); | |
| [arr init]; // no-crash | |
| } |