<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, May 28, 2014 at 5:23 PM, Jordan Rose <span dir="ltr"><<a href="mailto:jordan_rose@apple.com" target="_blank">jordan_rose@apple.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">We should treat blocks the same as lambdas. How about GNU StmtExprs?<br>
<br>
  if (check(OtherDtor()) &&<br>
      ({ int x = 1; NoReturnDtor(); x + 1})) { ... }<br>
<br>
To be fair, I'm not even sure how those are //supposed// to behave.<br></blockquote><div><br></div><div>I'll investigate more. </div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


I'm not sure how your last-bind trick really works. In this code: </blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
  First() && (Second() || Second()) && Third()<br>
<br>
none of the temporaries can be aggregated, but I'm not sure how LastBoundTemporary accomplishes that, even given your explanation.<br></blockquote><div><br></div><div>/me headdesks. Yes, it's wrong. I'll come up with a (hopefully) correct solution (see below for why).</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
Can we start with the inefficient version that tests every temporary individually, and then consolidate afterwards?<br></blockquote><div><br></div><div>Unfortunately that breaks invariants in the simple path-based reachability analysis, which then gives pretty bad false positives:</div>

<div>int f() {</div><div>  check(NoReturnDtor()) || somethingElse();</div><div>}</div><div>will trigger the "return from non-void function" warning, as with the simple version we now have a path running to the end of the function.</div>

<div><br></div><div>It also led to performance regressions in the analyzer with many temp dtors happening...</div><div><br></div><div>Thanks for your patience in reviewing my attempts!</div><div>Cheers,</div><div>/Manuel</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
================<br>
Comment at: test/Analysis/temporaries.cpp:336-338<br>
@@ +335,5 @@<br>
+      ++y;<br>
+      // Test that the CFG gets hooked up correctly when temporary destructors<br>
+      // are handled after a statically known branch condition.<br>
+      true ? (void)0 : (void)check(NoReturnDtor());<br>
+    }<br>
----------------<br>
If this is the right test, then the comment was all I really wanted. There is of course a difference between this and the if-statement — the destructor here is in the same full-expression as the condition.<br>
<br>
<a href="http://reviews.llvm.org/D3627" target="_blank">http://reviews.llvm.org/D3627</a><br>
<br>
<br>
</blockquote></div><br></div></div>