aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2012-09-29 01:36:42 +0000
committerJordan Rose <jordan_rose@apple.com>2012-09-29 01:36:42 +0000
commit846c898cebf02cb753125633c52e0d1d7fd94b4b (patch)
tree6890a15d90ca65f58892ee235786f295e5c927f4
parentf8afcffe6a0213760b64c211812b1750e1e1e967 (diff)
Revert "[analyzer] Handle inlined constructors for rvalue temporaries correctly."
This reverts commit 580cd17f256259f39a382e967173f34d68e73859. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164875 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp9
-rw-r--r--test/Analysis/array-struct-region.cpp6
-rw-r--r--test/Analysis/ctor-inlining.mm14
3 files changed, 7 insertions, 22 deletions
diff --git a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
index 2e460b79e7..eb5395e93c 100644
--- a/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
+++ b/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
@@ -160,14 +160,7 @@ void ExprEngine::processCallExit(ExplodedNode *CEBNode) {
svalBuilder.getCXXThis(CCE->getConstructor()->getParent(), calleeCtx);
SVal ThisV = state->getSVal(This);
- // If the constructed object is a prvalue, get its bindings.
- // Note that we have to be careful here because constructors embedded
- // in DeclStmts are not marked as lvalues.
- if (!CCE->isGLValue())
- if (const MemRegion *MR = ThisV.getAsRegion())
- if (isa<CXXTempObjectRegion>(MR))
- ThisV = state->getSVal(cast<Loc>(ThisV));
-
+ // Always bind the region to the CXXConstructExpr.
state = state->BindExpr(CCE, callerCtx, ThisV);
}
}
diff --git a/test/Analysis/array-struct-region.cpp b/test/Analysis/array-struct-region.cpp
index e7fbe4d987..22fbf2ff33 100644
--- a/test/Analysis/array-struct-region.cpp
+++ b/test/Analysis/array-struct-region.cpp
@@ -61,6 +61,12 @@ int getAssignedField(struct S s) {
void testArgument() {
clang_analyzer_eval(getConstrainedField(getS()) == 42); // expected-warning{{TRUE}}
+#if __cplusplus
+ // FIXME: Passing the struct by value seems to be confusing C++.
+ // Possibly related to <rdar://problem/12137950>.
+ // expected-warning@-4{{UNKNOWN}}
+#endif
+
clang_analyzer_eval(getAssignedField(getS()) == 42); // expected-warning{{TRUE}}
}
diff --git a/test/Analysis/ctor-inlining.mm b/test/Analysis/ctor-inlining.mm
index ac963e5d9b..918de0a456 100644
--- a/test/Analysis/ctor-inlining.mm
+++ b/test/Analysis/ctor-inlining.mm
@@ -103,17 +103,3 @@ namespace TemporaryConstructor {
return;
}
}
-
-
-namespace ConstructorUsedAsRValue {
- using TemporaryConstructor::BoolWrapper;
-
- bool extractValue(BoolWrapper b) {
- return b.value;
- }
-
- void test() {
- bool result = extractValue(BoolWrapper());
- clang_analyzer_eval(result); // expected-warning{{TRUE}}
- }
-}