1*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,debug.ExprInspection -analyzer-store=region -verify -Wno-objc-root-class %s 2*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,debug.ExprInspection -analyzer-store=region -verify -Wno-objc-root-class -fobjc-arc %s 3*67e74705SXin Li 4*67e74705SXin Livoid clang_analyzer_eval(bool); 5*67e74705SXin Livoid clang_analyzer_checkInlined(bool); 6*67e74705SXin Li 7*67e74705SXin Li@interface IntWrapper 8*67e74705SXin Li@property (readonly) int &value; 9*67e74705SXin Li@end 10*67e74705SXin Li 11*67e74705SXin Li@implementation IntWrapper 12*67e74705SXin Li@synthesize value; 13*67e74705SXin Li@end 14*67e74705SXin Li 15*67e74705SXin Livoid testReferenceConsistency(IntWrapper *w) { 16*67e74705SXin Li clang_analyzer_eval(w.value == w.value); // expected-warning{{TRUE}} 17*67e74705SXin Li clang_analyzer_eval(&w.value == &w.value); // expected-warning{{TRUE}} 18*67e74705SXin Li 19*67e74705SXin Li if (w.value != 42) 20*67e74705SXin Li return; 21*67e74705SXin Li 22*67e74705SXin Li clang_analyzer_eval(w.value == 42); // expected-warning{{TRUE}} 23*67e74705SXin Li} 24*67e74705SXin Li 25*67e74705SXin Livoid testReferenceAssignment(IntWrapper *w) { 26*67e74705SXin Li w.value = 42; 27*67e74705SXin Li clang_analyzer_eval(w.value == 42); // expected-warning{{TRUE}} 28*67e74705SXin Li} 29*67e74705SXin Li 30*67e74705SXin Li 31*67e74705SXin Listruct IntWrapperStruct { 32*67e74705SXin Li int value; 33*67e74705SXin Li}; 34*67e74705SXin Li 35*67e74705SXin Li@interface StructWrapper 36*67e74705SXin Li@property IntWrapperStruct inner; 37*67e74705SXin Li@end 38*67e74705SXin Li 39*67e74705SXin Li@implementation StructWrapper 40*67e74705SXin Li@synthesize inner; 41*67e74705SXin Li@end 42*67e74705SXin Li 43*67e74705SXin Livoid testConsistencyStruct(StructWrapper *w) { 44*67e74705SXin Li clang_analyzer_eval(w.inner.value == w.inner.value); // expected-warning{{TRUE}} 45*67e74705SXin Li 46*67e74705SXin Li int origValue = w.inner.value; 47*67e74705SXin Li if (origValue != 42) 48*67e74705SXin Li return; 49*67e74705SXin Li 50*67e74705SXin Li clang_analyzer_eval(w.inner.value == 42); // expected-warning{{TRUE}} 51*67e74705SXin Li} 52*67e74705SXin Li 53*67e74705SXin Li 54*67e74705SXin Liclass CustomCopy { 55*67e74705SXin Lipublic: 56*67e74705SXin Li CustomCopy() : value(0) {} 57*67e74705SXin Li CustomCopy(const CustomCopy &other) : value(other.value) { 58*67e74705SXin Li clang_analyzer_checkInlined(true); // expected-warning{{TRUE}} 59*67e74705SXin Li } 60*67e74705SXin Li int value; 61*67e74705SXin Li}; 62*67e74705SXin Li 63*67e74705SXin Li@interface CustomCopyWrapper 64*67e74705SXin Li@property CustomCopy inner; 65*67e74705SXin Li@end 66*67e74705SXin Li 67*67e74705SXin Li@implementation CustomCopyWrapper 68*67e74705SXin Li//@synthesize inner; 69*67e74705SXin Li@end 70*67e74705SXin Li 71*67e74705SXin Livoid testConsistencyCustomCopy(CustomCopyWrapper *w) { 72*67e74705SXin Li clang_analyzer_eval(w.inner.value == w.inner.value); // expected-warning{{TRUE}} 73*67e74705SXin Li 74*67e74705SXin Li int origValue = w.inner.value; 75*67e74705SXin Li if (origValue != 42) 76*67e74705SXin Li return; 77*67e74705SXin Li 78*67e74705SXin Li clang_analyzer_eval(w.inner.value == 42); // expected-warning{{TRUE}} 79*67e74705SXin Li} 80