| // 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 |