]> granicus.if.org Git - clang/commitdiff
handle CXXFunctionalCastExpr in visitLValue and Environment.
authorZhongxing Xu <xuzhongxing@gmail.com>
Thu, 25 Nov 2010 03:18:57 +0000 (03:18 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Thu, 25 Nov 2010 03:18:57 +0000 (03:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@120143 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Checker/Environment.cpp
lib/Checker/GRExprEngine.cpp
test/Analysis/method-call.cpp

index b09cb9d60401644d3819fa4ae001d8b8512d023a..798f9ba9dac423c27f77d1b45ad432cbcbb8f3c4 100644 (file)
@@ -78,6 +78,10 @@ SVal Environment::GetSVal(const Stmt *E, ValueManager& ValMgr) const {
       case Stmt::CXXBindTemporaryExprClass:
         E = cast<CXXBindTemporaryExpr>(E)->getSubExpr();
         continue;
+
+      case Stmt::CXXFunctionalCastExprClass:
+        E = cast<CXXFunctionalCastExpr>(E)->getSubExpr();
+        continue;
         
       // Handle all other Stmt* using a lookup.
       default:
index 2181b705f768c2de3fc5cef468395caff8c26a65..6db8dbab7d8ffd83240b361d6fb1b98927853931 100644 (file)
@@ -1158,6 +1158,18 @@ void GRExprEngine::VisitLValue(const Expr* Ex, ExplodedNode* Pred,
       break;
     }
 
+    case Stmt::CXXConstructExprClass: {
+      const CXXConstructExpr *expr = cast<CXXConstructExpr>(Ex);
+      VisitCXXConstructExpr(expr, 0, Pred, Dst, true);
+      break;
+    }
+
+    case Stmt::CXXFunctionalCastExprClass: {
+      const CXXFunctionalCastExpr *expr = cast<CXXFunctionalCastExpr>(Ex);
+      VisitLValue(expr->getSubExpr(), Pred, Dst);
+      break;
+    }
+
     case Stmt::CXXTemporaryObjectExprClass: {
       const CXXTemporaryObjectExpr *expr = cast<CXXTemporaryObjectExpr>(Ex);
       VisitCXXTemporaryObjectExpr(expr, Pred, Dst, true);
index 6cfbda895dec00463512a0aeffcda995ea6aa537..8c6b9da0f40163d8026b30a6a5673c65f84b16c3 100644 (file)
@@ -17,3 +17,14 @@ void f1() {
   }
 }
 
+void f2() {
+  const A &x = A(3);
+  if (x.getx() == 3) {
+    int *p = 0;
+    *p = 3;  // expected-warning{{Dereference of null pointer}}
+  } else {
+    int *p = 0;
+    *p = 3;  // no-warning
+  }
+}
+