1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -verify %s 2 3 // Test function pointer casts. Currently we track function addresses using 4 // loc::FunctionVal. Because casts can be arbitrary, do we need to model 5 // functions with regions? 6 typedef void* (*MyFuncTest1)(void); 7 8 MyFuncTest1 test1_aux(void); 9 void test1(void) { 10 void *x; 11 void* (*p)(void); 12 p = ((void*) test1_aux()); 13 if (p != ((void*) 0)) x = (*p)(); 14 } 15 16 // Test casts from void* to function pointers. Same issue as above: 17 // should we eventually model function pointers using regions? 18 void* test2(void *p) { 19 MyFuncTest1 fp = (MyFuncTest1) p; 20 return (*fp)(); 21 } 22 23 // <radar://10087620> 24 // A cast from int onjective C property reference to int. 25 typedef signed char BOOL; 26 @protocol NSObject - (BOOL)isEqual:(id)object; @end 27 @interface NSObject <NSObject> {} - (id)init; @end 28 typedef enum { 29 EEOne, 30 EETwo 31 } RDR10087620Enum; 32 @interface RDR10087620 : NSObject { 33 RDR10087620Enum elem; 34 } 35 @property (readwrite, nonatomic) RDR10087620Enum elem; 36 @end 37 38 static void 39 adium_media_ready_cb(RDR10087620 *InObj) 40 { 41 InObj.elem |= EEOne; 42 } 43