[analyzer] Look through ExprWhenCleanups when trying to track a NULL.

Silences a few false positives in LLVM.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177186 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
index 8cd3eec..bf616b1 100644
--- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
+++ b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
@@ -778,7 +778,8 @@
   if (!S || !N)
     return false;
 
-  // Peel off OpaqueValueExpr.
+  if (const ExprWithCleanups *EWC = dyn_cast<ExprWithCleanups>(S))
+    S = EWC->getSubExpr();
   if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(S))
     S = OVE->getSourceExpr();
 
diff --git a/test/Analysis/inlining/false-positive-suppression.cpp b/test/Analysis/inlining/false-positive-suppression.cpp
index 613f421..02782c3 100644
--- a/test/Analysis/inlining/false-positive-suppression.cpp
+++ b/test/Analysis/inlining/false-positive-suppression.cpp
@@ -40,6 +40,11 @@
 
 extern bool coin();
 
+class SomeClass {
+public:
+  void doSomething();
+};
+
 namespace References {
   class Map {
     int *&getNewBox();
@@ -83,11 +88,6 @@
     *box = 1; // expected-warning {{Dereference of null pointer}}
   }
 
-  class SomeClass {
-  public:
-    void doSomething();
-  };
-
   SomeClass *&getSomeClass() {
     if (coin()) {
       extern SomeClass *&opaqueClass();
@@ -174,3 +174,39 @@
 }
 
 
+namespace Cleanups {
+  class NonTrivial {
+  public:
+    ~NonTrivial();
+
+    SomeClass *getNull() {
+      return 0;
+    }
+  };
+
+  void testImmediate() {
+    NonTrivial().getNull()->doSomething();
+#ifndef SUPPRESSED
+    // expected-warning@-2 {{Called C++ object pointer is null}}
+#endif
+  }
+
+  void testAssignment() {
+    SomeClass *ptr = NonTrivial().getNull();
+    ptr->doSomething();
+#ifndef SUPPRESSED
+    // expected-warning@-2 {{Called C++ object pointer is null}}
+#endif
+  }
+
+  void testArgumentHelper(SomeClass *arg) {
+    arg->doSomething();
+#ifndef SUPPRESSED
+    // expected-warning@-2 {{Called C++ object pointer is null}}
+#endif
+  }
+
+  void testArgument() {
+    testArgumentHelper(NonTrivial().getNull());
+  }
+}