diff options
author | Jordan Rose <jordan_rose@apple.com> | 2012-07-26 20:04:21 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2012-07-26 20:04:21 +0000 |
commit | 3a0a9e3e8bbaa45f3ca22b1e20b3beaac0f5861e (patch) | |
tree | c76bbced794f967cad753fe08df73c3a3ec11fb9 /lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | |
parent | 075f6fbcb4d858c09e9b138f8dc10d8d3d43d935 (diff) |
[analyzer] Handle C++ member initializers and destructors.
This uses CFG to tell if a constructor call is for a member, and uses
the member's region appropriately.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160808 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core/ExprEngineCXX.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index b21928866c..88fba2919e 100644 --- a/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp @@ -63,6 +63,25 @@ void ExprEngine::VisitCXXConstructExpr(const CXXConstructExpr *CE, if (Var->getInit() == CE) Target = State->getLValue(Var, LCtx).getAsRegion(); + // Is this a constructor for a member? + if (const CFGInitializer *InitElem = dyn_cast<CFGInitializer>(&Next)) { + const CXXCtorInitializer *Init = InitElem->getInitializer(); + assert(Init->isAnyMemberInitializer()); + + const CXXMethodDecl *CurCtor = cast<CXXMethodDecl>(LCtx->getDecl()); + Loc ThisPtr = getSValBuilder().getCXXThis(CurCtor, + LCtx->getCurrentStackFrame()); + SVal ThisVal = State->getSVal(ThisPtr); + + if (Init->isIndirectMemberInitializer()) { + SVal Field = State->getLValue(Init->getIndirectMember(), ThisVal); + Target = cast<loc::MemRegionVal>(Field).getRegion(); + } else { + SVal Field = State->getLValue(Init->getMember(), ThisVal); + Target = cast<loc::MemRegionVal>(Field).getRegion(); + } + } + // FIXME: This will eventually need to handle new-expressions as well. } |