diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 7 | ||||
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/RegionStore.cpp | 2 |
2 files changed, 6 insertions, 3 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index eb83e202b77..8b6de132497 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -685,7 +685,8 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, StmtNodeBuilder Bldr2(PreVisit, Tmp, *currBldrCtx); const LocationContext *LCtx = Pred->getLocationContext(); - const Expr *ArgE = cast<CXXDefaultArgExpr>(S)->getExpr(); + const CXXDefaultArgExpr *DefaultE = cast<CXXDefaultArgExpr>(S); + const Expr *ArgE = DefaultE->getExpr(); // Avoid creating and destroying a lot of APSInts. SVal V; @@ -700,7 +701,9 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred, else V = State->getSVal(ArgE, LCtx); - State = State->BindExpr(S, LCtx, V); + State = State->BindExpr(DefaultE, LCtx, V); + if (DefaultE->isGLValue()) + State = createTemporaryRegionIfNeeded(State, LCtx, DefaultE); Bldr2.generateNode(S, *I, State); } diff --git a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp index 310c080fafb..acda9e0af32 100644 --- a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp +++ b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp @@ -1578,7 +1578,7 @@ static Optional<SVal> getConstValue(SValBuilder &SVB, const VarDecl *VD) { return None; llvm::APSInt Result; - if (Init->EvaluateAsInt(Result, Ctx)) + if (!Init->isGLValue() && Init->EvaluateAsInt(Result, Ctx)) return SVB.makeIntVal(Result); if (Init->isNullPointerConstant(Ctx, Expr::NPC_ValueDependentIsNotNull)) |