summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2018-06-28 00:11:42 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2018-06-28 00:11:42 +0000
commit4fb586c3494c7c9d35a77d06f4e95b059dea13ba (patch)
treeac2e4573a14b11c83659bab9c8ec5414600205c2 /clang/lib/StaticAnalyzer
parentff267df0de9664fa9af06987d455ae5f02425c3f (diff)
downloadbcm5719-llvm-4fb586c3494c7c9d35a77d06f4e95b059dea13ba.tar.gz
bcm5719-llvm-4fb586c3494c7c9d35a77d06f4e95b059dea13ba.zip
[analyzer] Re-enable lifetime extension for temporaries without destructors.
When an object's class provides no destructor, it's less important to materialize that object properly because we don't have to model the destructor correctly, so previously we skipped the support for these syntax patterns. Additionally, fix support for construction contexts of "static temporaries" (temporaries that are lifetime-extended by static references) because it turned out that we only had tests for them without destructors, which caused us to regress when we re-introduced the construction context for such temporaries. Differential Revision: https://reviews.llvm.org/D47658 llvm-svn: 335796
Diffstat (limited to 'clang/lib/StaticAnalyzer')
-rw-r--r--clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp16
1 files changed, 7 insertions, 9 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
index 497e1fa5560..2e8e14a7a0c 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
@@ -218,12 +218,6 @@ std::pair<ProgramStateRef, SVal> ExprEngine::prepareForObjectConstruction(
const CXXBindTemporaryExpr *BTE = TCC->getCXXBindTemporaryExpr();
const MaterializeTemporaryExpr *MTE = TCC->getMaterializedTemporaryExpr();
- if (!BTE) {
- // FIXME: Lifetime extension for temporaries without destructors
- // is not implemented yet.
- MTE = nullptr;
- }
-
if (MTE) {
if (const ValueDecl *VD = MTE->getExtendingDecl()) {
assert(MTE->getStorageDuration() != SD_FullExpression);
@@ -238,16 +232,20 @@ std::pair<ProgramStateRef, SVal> ExprEngine::prepareForObjectConstruction(
}
}
+ SVal V = UnknownVal();
if (MTE && MTE->getStorageDuration() != SD_FullExpression) {
// If the temporary is lifetime-extended, don't save the BTE,
// because we don't need a temporary destructor, but an automatic
// destructor.
BTE = nullptr;
+
+ if (MTE->getStorageDuration() == SD_Static ||
+ MTE->getStorageDuration() == SD_Thread)
+ V = loc::MemRegionVal(MRMgr.getCXXStaticTempObjectRegion(E));
}
- // FIXME: Support temporaries lifetime-extended via static references.
- // They'd need a getCXXStaticTempObjectRegion().
- SVal V = loc::MemRegionVal(MRMgr.getCXXTempObjectRegion(E, LCtx));
+ if (V.isUnknown())
+ V = loc::MemRegionVal(MRMgr.getCXXTempObjectRegion(E, LCtx));
if (BTE)
State = addObjectUnderConstruction(State, BTE, LCtx, V);
OpenPOWER on IntegriCloud