1*184c6242SDominic Chen// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config ipa=dynamic-bifurcate -verify %s 20a5e1b84SAnna Zaks 30a5e1b84SAnna Zakstypedef signed char BOOL; 40a5e1b84SAnna Zaks@protocol NSObject - (BOOL)isEqual:(id)object; @end 50a5e1b84SAnna Zaks@interface NSObject <NSObject> {} 60a5e1b84SAnna Zaks+(id)alloc; 70a5e1b84SAnna Zaks-(id)init; 80a5e1b84SAnna Zaks+(id)new; 90a5e1b84SAnna Zaks-(id)autorelease; 100a5e1b84SAnna Zaks-(id)copy; 110a5e1b84SAnna Zaks- (Class)class; 120a5e1b84SAnna Zaks-(id)retain; 130a5e1b84SAnna Zaks@end 140a5e1b84SAnna Zaksvoid clang_analyzer_eval(BOOL); 150a5e1b84SAnna Zaks 160a5e1b84SAnna Zaks@interface SomeOtherClass : NSObject 170a5e1b84SAnna Zaks- (int)getZero; 180a5e1b84SAnna Zaks@end 190a5e1b84SAnna Zaks@implementation SomeOtherClass 200a5e1b84SAnna Zaks- (int)getZero { return 0; } 210a5e1b84SAnna Zaks@end 220a5e1b84SAnna Zaks 230a5e1b84SAnna Zaks@interface MyClass : NSObject 240a5e1b84SAnna Zaks- (int)getZero; 250a5e1b84SAnna Zaks@end 260a5e1b84SAnna Zaks 270a5e1b84SAnna Zaks@implementation MyClass 280a5e1b84SAnna Zaks- (int)getZero { return 1; } 290a5e1b84SAnna Zaks 300a5e1b84SAnna Zaks// TODO: Not only we should correctly determine that the type of o at runtime 310a5e1b84SAnna Zaks// is MyClass, but we should also warn about it. 320a5e1b84SAnna Zaks+ (void) testCastToParent { 330a5e1b84SAnna Zaks id a = [[self alloc] init]; 340a5e1b84SAnna Zaks SomeOtherClass *o = a; 350a5e1b84SAnna Zaks clang_analyzer_eval([o getZero] == 0); // expected-warning{{FALSE}} 360a5e1b84SAnna Zaks} 370a5e1b84SAnna Zaks@end 38