// RUN: %clang_analyze_cc1 -w -Wno-int-conversion %s -verify \ // RUN: -analyzer-checker=core,alpha.core,debug.ExprInspection #ifdef HEADER // A clever trick to avoid splitting up the test. extern void clang_analyzer_eval(int); @interface NSObject @end @interface HeaderClass : NSObject @property NSObject *prop; @end #else #define HEADER #include "ObjCProperties.m" @implementation HeaderClass - (void)foo { if ((self.prop)) { } // This test tests that no dynamic bifurcation is performed on the property. // The TRUE/FALSE dilemma correctly arises from eagerly-assume behavior // inside the if-statement. The dynamic bifurcation at (self.prop) inside // the if-statement was causing an UNKNOWN to show up as well due to // extra parentheses being caught inside PseudoObjectExpr. // This should not be UNKNOWN. clang_analyzer_eval(self.prop); // expected-warning{{TRUE}} // expected-warning@-1{{FALSE}} } @end // The point of this test cases is to exercise properties in the static // analyzer @interface MyClass { @private id _X; } - (id)initWithY:(id)Y; @property(copy, readwrite) id X; @end @implementation MyClass @synthesize X = _X; - (id)initWithY:(id)Y { self.X = Y; return self; } @end #endif