// 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 - (void) myFunction:(int*)p myParam:(int) n; @end @interface NSArray : 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 *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 *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 }