| // RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-output=text -analyzer-config graph-trim-interval=5 -analyzer-config suppress-null-return-paths=false -verify %s | 
 | // RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-output=plist-multi-file -analyzer-config graph-trim-interval=5 -analyzer-config suppress-null-return-paths=false -analyzer-config path-diagnostics-alternate=false %s -o %t.plist | 
 | // RUN: FileCheck --input-file=%t.plist %s | 
 |  | 
 | typedef struct { | 
 |   int getValue(); | 
 | } IntWrapper; | 
 |  | 
 | IntWrapper *getNullWrapper() { | 
 |   return 0; | 
 |   // expected-note@-1 {{Returning null pointer}} | 
 | } | 
 |  | 
 | int memberCallBaseDisappears() { | 
 |   // In this case, we need the lvalue-to-rvalue cast for 'ptr' to disappear, | 
 |   // which means we need to trigger reclamation between that and the -> | 
 |   // operator. | 
 |   // | 
 |   // Note that this test is EXTREMELY brittle because it's a negative test: | 
 |   // we want to show that even if the node for the rvalue of 'ptr' disappears, | 
 |   // we get the same results as if it doesn't. The test should never fail even | 
 |   // if our node reclamation policy changes, but it could easily not be testing | 
 |   // anything at that point. | 
 |   IntWrapper *ptr = getNullWrapper(); | 
 |   // expected-note@-1 {{Calling 'getNullWrapper'}} | 
 |   // expected-note@-2 {{Returning from 'getNullWrapper'}} | 
 |   // expected-note@-3 {{'ptr' initialized to a null pointer value}} | 
 |  | 
 |   // Burn some nodes to trigger reclamation. | 
 |   int unused = 1; | 
 |   (void)unused; | 
 |  | 
 |   return ptr->getValue(); // expected-warning {{Called C++ object pointer is null}} | 
 |   // expected-note@-1 {{Called C++ object pointer is null}} | 
 | } | 
 |  | 
 | // CHECK:  <key>diagnostics</key> | 
 | // CHECK-NEXT:  <array> | 
 | // CHECK-NEXT:   <dict> | 
 | // CHECK-NEXT:    <key>path</key> | 
 | // CHECK-NEXT:    <array> | 
 | // CHECK-NEXT:     <dict> | 
 | // CHECK-NEXT:      <key>kind</key><string>control</string> | 
 | // CHECK-NEXT:      <key>edges</key> | 
 | // CHECK-NEXT:       <array> | 
 | // CHECK-NEXT:        <dict> | 
 | // CHECK-NEXT:         <key>start</key> | 
 | // CHECK-NEXT:          <array> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>3</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>12</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:          </array> | 
 | // CHECK-NEXT:         <key>end</key> | 
 | // CHECK-NEXT:          <array> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>21</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>34</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:          </array> | 
 | // CHECK-NEXT:        </dict> | 
 | // CHECK-NEXT:       </array> | 
 | // CHECK-NEXT:     </dict> | 
 | // CHECK-NEXT:     <dict> | 
 | // CHECK-NEXT:      <key>kind</key><string>event</string> | 
 | // CHECK-NEXT:      <key>location</key> | 
 | // CHECK-NEXT:      <dict> | 
 | // CHECK-NEXT:       <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:       <key>col</key><integer>21</integer> | 
 | // CHECK-NEXT:       <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:      </dict> | 
 | // CHECK-NEXT:      <key>ranges</key> | 
 | // CHECK-NEXT:      <array> | 
 | // CHECK-NEXT:        <array> | 
 | // CHECK-NEXT:         <dict> | 
 | // CHECK-NEXT:          <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:          <key>col</key><integer>21</integer> | 
 | // CHECK-NEXT:          <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:         </dict> | 
 | // CHECK-NEXT:         <dict> | 
 | // CHECK-NEXT:          <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:          <key>col</key><integer>36</integer> | 
 | // CHECK-NEXT:          <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:         </dict> | 
 | // CHECK-NEXT:        </array> | 
 | // CHECK-NEXT:      </array> | 
 | // CHECK-NEXT:      <key>depth</key><integer>0</integer> | 
 | // CHECK-NEXT:      <key>extended_message</key> | 
 | // CHECK-NEXT:      <string>Calling 'getNullWrapper'</string> | 
 | // CHECK-NEXT:      <key>message</key> | 
 | // CHECK-NEXT:      <string>Calling 'getNullWrapper'</string> | 
 | // CHECK-NEXT:     </dict> | 
 | // CHECK-NEXT:     <dict> | 
 | // CHECK-NEXT:      <key>kind</key><string>event</string> | 
 | // CHECK-NEXT:      <key>location</key> | 
 | // CHECK-NEXT:      <dict> | 
 | // CHECK-NEXT:       <key>line</key><integer>9</integer> | 
 | // CHECK-NEXT:       <key>col</key><integer>1</integer> | 
 | // CHECK-NEXT:       <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:      </dict> | 
 | // CHECK-NEXT:      <key>depth</key><integer>1</integer> | 
 | // CHECK-NEXT:      <key>extended_message</key> | 
 | // CHECK-NEXT:      <string>Entered call from 'memberCallBaseDisappears'</string> | 
 | // CHECK-NEXT:      <key>message</key> | 
 | // CHECK-NEXT:      <string>Entered call from 'memberCallBaseDisappears'</string> | 
 | // CHECK-NEXT:     </dict> | 
 | // CHECK-NEXT:     <dict> | 
 | // CHECK-NEXT:      <key>kind</key><string>control</string> | 
 | // CHECK-NEXT:      <key>edges</key> | 
 | // CHECK-NEXT:       <array> | 
 | // CHECK-NEXT:        <dict> | 
 | // CHECK-NEXT:         <key>start</key> | 
 | // CHECK-NEXT:          <array> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>9</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>1</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>9</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>10</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:          </array> | 
 | // CHECK-NEXT:         <key>end</key> | 
 | // CHECK-NEXT:          <array> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>10</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>3</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>10</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>8</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:          </array> | 
 | // CHECK-NEXT:        </dict> | 
 | // CHECK-NEXT:       </array> | 
 | // CHECK-NEXT:     </dict> | 
 | // CHECK-NEXT:     <dict> | 
 | // CHECK-NEXT:      <key>kind</key><string>event</string> | 
 | // CHECK-NEXT:      <key>location</key> | 
 | // CHECK-NEXT:      <dict> | 
 | // CHECK-NEXT:       <key>line</key><integer>10</integer> | 
 | // CHECK-NEXT:       <key>col</key><integer>3</integer> | 
 | // CHECK-NEXT:       <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:      </dict> | 
 | // CHECK-NEXT:      <key>ranges</key> | 
 | // CHECK-NEXT:      <array> | 
 | // CHECK-NEXT:        <array> | 
 | // CHECK-NEXT:         <dict> | 
 | // CHECK-NEXT:          <key>line</key><integer>10</integer> | 
 | // CHECK-NEXT:          <key>col</key><integer>3</integer> | 
 | // CHECK-NEXT:          <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:         </dict> | 
 | // CHECK-NEXT:         <dict> | 
 | // CHECK-NEXT:          <key>line</key><integer>10</integer> | 
 | // CHECK-NEXT:          <key>col</key><integer>10</integer> | 
 | // CHECK-NEXT:          <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:         </dict> | 
 | // CHECK-NEXT:        </array> | 
 | // CHECK-NEXT:      </array> | 
 | // CHECK-NEXT:      <key>depth</key><integer>1</integer> | 
 | // CHECK-NEXT:      <key>extended_message</key> | 
 | // CHECK-NEXT:      <string>Returning null pointer</string> | 
 | // CHECK-NEXT:      <key>message</key> | 
 | // CHECK-NEXT:      <string>Returning null pointer</string> | 
 | // CHECK-NEXT:     </dict> | 
 | // CHECK-NEXT:     <dict> | 
 | // CHECK-NEXT:      <key>kind</key><string>event</string> | 
 | // CHECK-NEXT:      <key>location</key> | 
 | // CHECK-NEXT:      <dict> | 
 | // CHECK-NEXT:       <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:       <key>col</key><integer>21</integer> | 
 | // CHECK-NEXT:       <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:      </dict> | 
 | // CHECK-NEXT:      <key>ranges</key> | 
 | // CHECK-NEXT:      <array> | 
 | // CHECK-NEXT:        <array> | 
 | // CHECK-NEXT:         <dict> | 
 | // CHECK-NEXT:          <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:          <key>col</key><integer>21</integer> | 
 | // CHECK-NEXT:          <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:         </dict> | 
 | // CHECK-NEXT:         <dict> | 
 | // CHECK-NEXT:          <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:          <key>col</key><integer>36</integer> | 
 | // CHECK-NEXT:          <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:         </dict> | 
 | // CHECK-NEXT:        </array> | 
 | // CHECK-NEXT:      </array> | 
 | // CHECK-NEXT:      <key>depth</key><integer>0</integer> | 
 | // CHECK-NEXT:      <key>extended_message</key> | 
 | // CHECK-NEXT:      <string>Returning from 'getNullWrapper'</string> | 
 | // CHECK-NEXT:      <key>message</key> | 
 | // CHECK-NEXT:      <string>Returning from 'getNullWrapper'</string> | 
 | // CHECK-NEXT:     </dict> | 
 | // CHECK-NEXT:     <dict> | 
 | // CHECK-NEXT:      <key>kind</key><string>control</string> | 
 | // CHECK-NEXT:      <key>edges</key> | 
 | // CHECK-NEXT:       <array> | 
 | // CHECK-NEXT:        <dict> | 
 | // CHECK-NEXT:         <key>start</key> | 
 | // CHECK-NEXT:          <array> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>21</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>34</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:          </array> | 
 | // CHECK-NEXT:         <key>end</key> | 
 | // CHECK-NEXT:          <array> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>3</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>12</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:          </array> | 
 | // CHECK-NEXT:        </dict> | 
 | // CHECK-NEXT:       </array> | 
 | // CHECK-NEXT:     </dict> | 
 | // CHECK-NEXT:     <dict> | 
 | // CHECK-NEXT:      <key>kind</key><string>event</string> | 
 | // CHECK-NEXT:      <key>location</key> | 
 | // CHECK-NEXT:      <dict> | 
 | // CHECK-NEXT:       <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:       <key>col</key><integer>3</integer> | 
 | // CHECK-NEXT:       <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:      </dict> | 
 | // CHECK-NEXT:      <key>ranges</key> | 
 | // CHECK-NEXT:      <array> | 
 | // CHECK-NEXT:        <array> | 
 | // CHECK-NEXT:         <dict> | 
 | // CHECK-NEXT:          <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:          <key>col</key><integer>3</integer> | 
 | // CHECK-NEXT:          <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:         </dict> | 
 | // CHECK-NEXT:         <dict> | 
 | // CHECK-NEXT:          <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:          <key>col</key><integer>17</integer> | 
 | // CHECK-NEXT:          <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:         </dict> | 
 | // CHECK-NEXT:        </array> | 
 | // CHECK-NEXT:      </array> | 
 | // CHECK-NEXT:      <key>depth</key><integer>0</integer> | 
 | // CHECK-NEXT:      <key>extended_message</key> | 
 | // CHECK-NEXT:      <string>'ptr' initialized to a null pointer value</string> | 
 | // CHECK-NEXT:      <key>message</key> | 
 | // CHECK-NEXT:      <string>'ptr' initialized to a null pointer value</string> | 
 | // CHECK-NEXT:     </dict> | 
 | // CHECK-NEXT:     <dict> | 
 | // CHECK-NEXT:      <key>kind</key><string>control</string> | 
 | // CHECK-NEXT:      <key>edges</key> | 
 | // CHECK-NEXT:       <array> | 
 | // CHECK-NEXT:        <dict> | 
 | // CHECK-NEXT:         <key>start</key> | 
 | // CHECK-NEXT:          <array> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>3</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>24</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>12</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:          </array> | 
 | // CHECK-NEXT:         <key>end</key> | 
 | // CHECK-NEXT:          <array> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>33</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>3</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>33</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>8</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:          </array> | 
 | // CHECK-NEXT:        </dict> | 
 | // CHECK-NEXT:       </array> | 
 | // CHECK-NEXT:     </dict> | 
 | // CHECK-NEXT:     <dict> | 
 | // CHECK-NEXT:      <key>kind</key><string>control</string> | 
 | // CHECK-NEXT:      <key>edges</key> | 
 | // CHECK-NEXT:       <array> | 
 | // CHECK-NEXT:        <dict> | 
 | // CHECK-NEXT:         <key>start</key> | 
 | // CHECK-NEXT:          <array> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>33</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>3</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>33</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>8</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:          </array> | 
 | // CHECK-NEXT:         <key>end</key> | 
 | // CHECK-NEXT:          <array> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>33</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>10</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:           <dict> | 
 | // CHECK-NEXT:            <key>line</key><integer>33</integer> | 
 | // CHECK-NEXT:            <key>col</key><integer>12</integer> | 
 | // CHECK-NEXT:            <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:           </dict> | 
 | // CHECK-NEXT:          </array> | 
 | // CHECK-NEXT:        </dict> | 
 | // CHECK-NEXT:       </array> | 
 | // CHECK-NEXT:     </dict> | 
 | // CHECK-NEXT:     <dict> | 
 | // CHECK-NEXT:      <key>kind</key><string>event</string> | 
 | // CHECK-NEXT:      <key>location</key> | 
 | // CHECK-NEXT:      <dict> | 
 | // CHECK-NEXT:       <key>line</key><integer>33</integer> | 
 | // CHECK-NEXT:       <key>col</key><integer>10</integer> | 
 | // CHECK-NEXT:       <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:      </dict> | 
 | // CHECK-NEXT:      <key>ranges</key> | 
 | // CHECK-NEXT:      <array> | 
 | // CHECK-NEXT:        <array> | 
 | // CHECK-NEXT:         <dict> | 
 | // CHECK-NEXT:          <key>line</key><integer>33</integer> | 
 | // CHECK-NEXT:          <key>col</key><integer>10</integer> | 
 | // CHECK-NEXT:          <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:         </dict> | 
 | // CHECK-NEXT:         <dict> | 
 | // CHECK-NEXT:          <key>line</key><integer>33</integer> | 
 | // CHECK-NEXT:          <key>col</key><integer>12</integer> | 
 | // CHECK-NEXT:          <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:         </dict> | 
 | // CHECK-NEXT:        </array> | 
 | // CHECK-NEXT:      </array> | 
 | // CHECK-NEXT:      <key>depth</key><integer>0</integer> | 
 | // CHECK-NEXT:      <key>extended_message</key> | 
 | // CHECK-NEXT:      <string>Called C++ object pointer is null</string> | 
 | // CHECK-NEXT:      <key>message</key> | 
 | // CHECK-NEXT:      <string>Called C++ object pointer is null</string> | 
 | // CHECK-NEXT:     </dict> | 
 | // CHECK-NEXT:    </array> | 
 | // CHECK-NEXT:    <key>description</key><string>Called C++ object pointer is null</string> | 
 | // CHECK-NEXT:    <key>category</key><string>Logic error</string> | 
 | // CHECK-NEXT:    <key>type</key><string>Called C++ object pointer is null</string> | 
 | // CHECK-NEXT:   <key>issue_context_kind</key><string>function</string> | 
 | // CHECK-NEXT:   <key>issue_context</key><string>memberCallBaseDisappears</string> | 
 | // CHECK-NEXT:   <key>issue_hash</key><string>19</string> | 
 | // CHECK-NEXT:   <key>location</key> | 
 | // CHECK-NEXT:   <dict> | 
 | // CHECK-NEXT:    <key>line</key><integer>33</integer> | 
 | // CHECK-NEXT:    <key>col</key><integer>10</integer> | 
 | // CHECK-NEXT:    <key>file</key><integer>0</integer> | 
 | // CHECK-NEXT:   </dict> | 
 | // CHECK-NEXT:   </dict> | 
 | // CHECK-NEXT:  </array> |