xref: /llvm-project/clang/test/Analysis/inlining/ObjCImproperDynamictallyDetectableCast.m (revision 184c6242faca0be0188611d45b41235e68ef282a)
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