summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Labath <labath@google.com>2013-08-09 07:46:29 +0000
committerPavel Labath <labath@google.com>2013-08-09 07:46:29 +0000
commit375e18e32c01899086632f1a5b019e714a80daa0 (patch)
tree5ffdc456ebf6a1064ffb1842558632483b6dcbb3
parente620366aa3394e6d0e1103f1cb4f2dfd2a412380 (diff)
downloadbcm5719-llvm-375e18e32c01899086632f1a5b019e714a80daa0.tar.gz
bcm5719-llvm-375e18e32c01899086632f1a5b019e714a80daa0.zip
[analyzer] Enable usage of temporaries in InitListExprs
Summary: ExprEngine had code which specificaly disabled using CXXTempObjectRegions in InitListExprs. This was a hack put in r168757 to silence a false positive. The underlying problem seems to have been fixed in the mean time, as removing this code doesn't seem to break anything. Therefore I propose to remove it and solve PR16629 in the process. Reviewers: jordan_rose CC: cfe-commits Differential Revision: http://llvm-reviews.chandlerc.com/D1325 llvm-svn: 188059
-rw-r--r--clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp2
-rw-r--r--clang/test/Analysis/temporaries.cpp36
2 files changed, 36 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp
index 888963359b4..a5bd74f9204 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp
@@ -596,8 +596,6 @@ void ExprEngine::VisitInitListExpr(const InitListExpr *IE,
for (InitListExpr::const_reverse_iterator it = IE->rbegin(),
ei = IE->rend(); it != ei; ++it) {
SVal V = state->getSVal(cast<Expr>(*it), LCtx);
- if (dyn_cast_or_null<CXXTempObjectRegion>(V.getAsRegion()))
- V = UnknownVal();
vals = getBasicVals().consVals(V, vals);
}
diff --git a/clang/test/Analysis/temporaries.cpp b/clang/test/Analysis/temporaries.cpp
index ea4abb2d843..5e1771cc441 100644
--- a/clang/test/Analysis/temporaries.cpp
+++ b/clang/test/Analysis/temporaries.cpp
@@ -157,3 +157,39 @@ void testStaticMaterializeTemporaryExpr() {
clang_analyzer_eval(threadDirectRef.value == 42); // expected-warning{{TRUE}}
#endif
}
+
+namespace PR16629 {
+ struct A {
+ explicit A(int* p_) : p(p_) {}
+ int* p;
+ };
+
+ extern void escape(const A*[]);
+ extern void check(int);
+
+ void callEscape(const A& a) {
+ const A* args[] = { &a };
+ escape(args);
+ }
+
+ void testNoWarning() {
+ int x;
+ callEscape(A(&x));
+ check(x); // Analyzer used to give a "x is uninitialized warning" here
+ }
+
+ void set(const A*a[]) {
+ *a[0]->p = 47;
+ }
+
+ void callSet(const A& a) {
+ const A* args[] = { &a };
+ set(args);
+ }
+
+ void testConsistency() {
+ int x;
+ callSet(A(&x));
+ clang_analyzer_eval(x == 47); // expected-warning{{TRUE}}
+ }
+}
OpenPOWER on IntegriCloud