]> granicus.if.org Git - clang/commitdiff
Don't conjure a symbol for DeclStmts when the variable is a C++ reference.
authorTed Kremenek <kremenek@apple.com>
Tue, 2 Mar 2010 21:43:52 +0000 (21:43 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 2 Mar 2010 21:43:52 +0000 (21:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97590 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Checker/GRExprEngine.cpp

index 964f7fac896f47fbaf9cb8250bb8258605b1eb92..ad229c7b8fbc85ca8834b0f845175213ac64c161 100644 (file)
@@ -2358,8 +2358,9 @@ void GRExprEngine::VisitDeclStmt(DeclStmt *DS, ExplodedNode *Pred,
 
       // Recover some path-sensitivity if a scalar value evaluated to
       // UnknownVal.
-      if (InitVal.isUnknown() ||
-          !getConstraintManager().canReasonAbout(InitVal)) {
+      if ((InitVal.isUnknown() ||
+          !getConstraintManager().canReasonAbout(InitVal)) &&
+          !VD->getType()->isReferenceType()) {
         InitVal = ValMgr.getConjuredSymbolVal(NULL, InitEx,
                                                Builder->getCurrentBlockCount());
       }
@@ -2901,9 +2902,8 @@ void GRExprEngine::VisitReturnStmt(ReturnStmt *RS, ExplodedNode *Pred,
   if (Expr *RetE = RS->getRetValue()) {
     // Record the returned expression in the state.
     {
-      static int Tag;
-      SaveAndRestore<const void *> OldTag(Builder->Tag);
-      Builder->Tag = &Tag;
+      static int Tag = 0;
+      SaveAndRestore<const void *> OldTag(Builder->Tag, &Tag);
       const GRState *state = GetState(Pred);
       state = state->set<ReturnExpr>(RetE);
       Pred = Builder->generateNode(RetE, state, Pred);