diff options
| author | Jordan Rose <jordan_rose@apple.com> | 2013-07-17 17:16:42 +0000 | 
|---|---|---|
| committer | Jordan Rose <jordan_rose@apple.com> | 2013-07-17 17:16:42 +0000 | 
| commit | 5f6c173e7cb4f6a74c1aec2af3ae478a995c140d (patch) | |
| tree | c2c11122caf7b3ebc02ad4115f399af195d717dc /clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | |
| parent | 5fded08403ed0f138e057e78338d77dd321e59ee (diff) | |
| download | bcm5719-llvm-5f6c173e7cb4f6a74c1aec2af3ae478a995c140d.tar.gz bcm5719-llvm-5f6c173e7cb4f6a74c1aec2af3ae478a995c140d.zip | |
[analyzer] Handle C++11 member initializer expressions.
Previously, we would simply abort the path when we saw a default member
initialization; now, we actually attempt to evaluate it. Like default
arguments, the contents of these expressions are not actually part of the
current function, so we fall back to constant evaluation.
llvm-svn: 186521
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/ExprEngine.cpp')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/ExprEngine.cpp | 22 | 
1 files changed, 14 insertions, 8 deletions
| diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp index ff8a9e86613..0b31495c840 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngine.cpp @@ -612,7 +612,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,    switch (S->getStmtClass()) {      // C++ and ARC stuff we don't support yet.      case Expr::ObjCIndirectCopyRestoreExprClass: -    case Stmt::CXXDefaultInitExprClass:      case Stmt::CXXDependentScopeMemberExprClass:      case Stmt::CXXPseudoDestructorExprClass:      case Stmt::CXXTryStmtClass: @@ -737,7 +736,8 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,        break;      } -    case Stmt::CXXDefaultArgExprClass: { +    case Stmt::CXXDefaultArgExprClass: +    case Stmt::CXXDefaultInitExprClass: {        Bldr.takeNodes(Pred);        ExplodedNodeSet PreVisit;        getCheckerManager().runCheckersForPreStmt(PreVisit, Pred, S, *this); @@ -745,9 +745,13 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,        ExplodedNodeSet Tmp;        StmtNodeBuilder Bldr2(PreVisit, Tmp, *currBldrCtx); -      const LocationContext *LCtx = Pred->getLocationContext(); -      const CXXDefaultArgExpr *DefaultE = cast<CXXDefaultArgExpr>(S); -      const Expr *ArgE = DefaultE->getExpr(); +      const Expr *ArgE; +      if (const CXXDefaultArgExpr *DefE = dyn_cast<CXXDefaultArgExpr>(S)) +        ArgE = DefE->getExpr(); +      else if (const CXXDefaultInitExpr *DefE = dyn_cast<CXXDefaultInitExpr>(S)) +        ArgE = DefE->getExpr(); +      else +        llvm_unreachable("unknown constant wrapper kind");        bool IsTemporary = false;        if (const MaterializeTemporaryExpr *MTE = @@ -760,13 +764,15 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,        if (!ConstantVal)          ConstantVal = UnknownVal(); +      const LocationContext *LCtx = Pred->getLocationContext();        for (ExplodedNodeSet::iterator I = PreVisit.begin(), E = PreVisit.end();             I != E; ++I) {          ProgramStateRef State = (*I)->getState(); -        State = State->BindExpr(DefaultE, LCtx, *ConstantVal); +        State = State->BindExpr(S, LCtx, *ConstantVal);          if (IsTemporary) -          State = createTemporaryRegionIfNeeded(State, LCtx, DefaultE, -                                                DefaultE); +          State = createTemporaryRegionIfNeeded(State, LCtx, +                                                cast<Expr>(S), +                                                cast<Expr>(S));          Bldr2.generateNode(S, *I, State);        } | 

