<div dir="ltr"><div>+ <a href="mailto:kremenek@apple.com">kremenek@apple.com</a><br></div><div><br></div><div>Original patch was made by Ted, but I couldn't find his username on the differential website thingy.</div></div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On 8 August 2013 16:51, Pavel Labath <span dir="ltr"><<a href="mailto:labath@google.com" target="_blank">labath@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi jordan_rose,<br>
<br>
ExprEngine had code which specificaly disabled using CXXTempObjectRegions in<br>
InitListExprs. This was a hack put in r168757 to silence a false positive.<br>
<br>
The underlying problem seems to have been fixed in the mean time, as removing<br>
this code doesn't seem to break anything. Therefore I propose to remove it and<br>
solve PR16629 in the process.<br>
<br>
<a href="http://llvm-reviews.chandlerc.com/D1325" target="_blank">http://llvm-reviews.chandlerc.com/D1325</a><br>
<br>
Files:<br>
  lib/StaticAnalyzer/Core/ExprEngineC.cpp<br>
  test/Analysis/temporaries.cpp<br>
<br>
Index: lib/StaticAnalyzer/Core/ExprEngineC.cpp<br>
===================================================================<br>
--- lib/StaticAnalyzer/Core/ExprEngineC.cpp<br>
+++ lib/StaticAnalyzer/Core/ExprEngineC.cpp<br>
@@ -596,8 +596,6 @@<br>
     for (InitListExpr::const_reverse_iterator it = IE->rbegin(),<br>
          ei = IE->rend(); it != ei; ++it) {<br>
       SVal V = state->getSVal(cast<Expr>(*it), LCtx);<br>
-      if (dyn_cast_or_null<CXXTempObjectRegion>(V.getAsRegion()))<br>
-        V = UnknownVal();<br>
       vals = getBasicVals().consVals(V, vals);<br>
     }<br>
<br>
Index: test/Analysis/temporaries.cpp<br>
===================================================================<br>
--- test/Analysis/temporaries.cpp<br>
+++ test/Analysis/temporaries.cpp<br>
@@ -157,3 +157,39 @@<br>
   clang_analyzer_eval(threadDirectRef.value == 42); // expected-warning{{TRUE}}<br>
 #endif<br>
 }<br>
+<br>
+namespace PR16629 {<br>
+  struct A {<br>
+    explicit A(int* p_) : p(p_) {}<br>
+    int* p;<br>
+  };<br>
+<br>
+  extern void escape(const A*[]);<br>
+  extern void check(int);<br>
+<br>
+  void callEscape(const A& a) {<br>
+    const A* args[] = { &a };<br>
+    escape(args);<br>
+  }<br>
+<br>
+  void testNoWarning() {<br>
+    int x;<br>
+    callEscape(A(&x));<br>
+    check(x); // Analyzer used to give a "x is uninitialized warning" here<br>
+  }<br>
+<br>
+  void set(const A*a[]) {<br>
+    *a[0]->p = 47;<br>
+  }<br>
+<br>
+  void callSet(const A& a) {<br>
+    const A* args[] = { &a };<br>
+    set(args);<br>
+  }<br>
+<br>
+  void testConsistency() {<br>
+    int x;<br>
+    callSet(A(&x));<br>
+    clang_analyzer_eval(x == 47); // expected-warning{{TRUE}}<br>
+  }<br>
+}<br>
</blockquote></div><br></div>