diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-11-01 09:09:44 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2010-11-01 09:09:44 +0000 |
commit | 7ce351db56fbce162a3b650518ce05b5c61ebf36 (patch) | |
tree | b8e666185681f67251775ca0ef80be4790669b4d /lib/Checker/GRExprEngine.cpp | |
parent | 81bc7d07b701042371a5723b6f394cd2482ed7be (diff) |
Now initializer of C++ record type is visited as block-level expr.
Let the destination of AggExprVisitor be an explicit MemRegion.
Reenable the test case.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117908 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Checker/GRExprEngine.cpp')
-rw-r--r-- | lib/Checker/GRExprEngine.cpp | 24 |
1 files changed, 9 insertions, 15 deletions
diff --git a/lib/Checker/GRExprEngine.cpp b/lib/Checker/GRExprEngine.cpp index d542c2c293..1669a353a5 100644 --- a/lib/Checker/GRExprEngine.cpp +++ b/lib/Checker/GRExprEngine.cpp @@ -679,7 +679,6 @@ void GRExprEngine::Visit(const Stmt* S, ExplodedNode* Pred, // C++ stuff we don't support yet. case Stmt::CXXBindTemporaryExprClass: case Stmt::CXXCatchStmtClass: - case Stmt::CXXConstructExprClass: case Stmt::CXXDefaultArgExprClass: case Stmt::CXXDependentScopeMemberExprClass: case Stmt::CXXExprWithTemporariesClass: @@ -810,6 +809,14 @@ void GRExprEngine::Visit(const Stmt* S, ExplodedNode* Pred, break; } + case Stmt::CXXConstructExprClass: { + const CXXConstructExpr *C = cast<CXXConstructExpr>(S); + // For block-level CXXConstructExpr, we don't have a destination region. + // Let VisitCXXConstructExpr() create one. + VisitCXXConstructExpr(C, 0, Pred, Dst); + break; + } + case Stmt::CXXMemberCallExprClass: { const CXXMemberCallExpr *MCE = cast<CXXMemberCallExpr>(S); VisitCXXMemberCallExpr(MCE, Pred, Dst); @@ -2592,20 +2599,7 @@ void GRExprEngine::VisitDeclStmt(const DeclStmt *DS, ExplodedNode *Pred, ExplodedNodeSet Tmp; if (InitEx) { - QualType InitTy = InitEx->getType(); - if (getContext().getLangOptions().CPlusPlus && InitTy->isRecordType()) { - // Delegate expressions of C++ record type evaluation to AggExprVisitor. - VisitAggExpr(InitEx, GetState(Pred)->getLValue(VD, - Pred->getLocationContext()), Pred, Tmp); - - // FIXME: remove later when all paths through VisitAggExpr work properly - if (Tmp.empty()) - Tmp.Add(Pred); - // Call checkers for initialized aggregates - CheckerVisit(DS, Dst, Tmp, PreVisitStmtCallback); - - return; - } else if (VD->getType()->isReferenceType()) + if (VD->getType()->isReferenceType()) VisitLValue(InitEx, Pred, Tmp); else Visit(InitEx, Pred, Tmp); |