<br><br><div class="gmail_quote">2010/11/14 Marcin Świderski <span dir="ltr"><<a href="mailto:marcin.sfider@gmail.com">marcin.sfider@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="gmail_quote">W dniu 13 listopada 2010 12:37 użytkownik Zhongxing Xu <span dir="ltr"><<a href="mailto:xuzhongxing@gmail.com" target="_blank">xuzhongxing@gmail.com</a>></span> napisał:<div class="im"><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

I see some unbalancing before this patch. (See the test case that was modified.) Could you provide an example that is unbalanced by this patch?<br><br><div class="gmail_quote">2010/11/13 Marcin Świderski <span dir="ltr"><<a href="mailto:marcin.sfider@gmail.com" target="_blank">marcin.sfider@gmail.com</a>></span><div>

<div></div><div><br>
<blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204, 204, 204);padding-left:1ex">Hi Zhongxing<div><br></div><div>Won't it lead to unbalancing ctors/dtors like I've written in discusion after commit r118159?<br>


<br><div class="gmail_quote"><br></div></div></blockquote></div></div></div></blockquote></div><div>When I wrote about unbalancing I meant that removing elidable CXXConstructExpr and then removing destructors for temporaries that where created with those expressions will unbalance ctors/dtors calls. Because not every call to the ctor is a block level statement this is not visualised in the CFG.</div>

<div><br></div><div>Example of this is simple:</div><div><br></div><div><div>class A {</div><div>public:</div><div>  A() {}</div><div>  ~A() {}</div><div>};</div><div><br></div><div>A foo() { return A(); }</div><div><br>
</div>
</div><div>AST for function foo() looks like this:</div><div><br></div><div><div>A foo() (CompoundStmt 0x105048b98 <main.cpp:7:9, col:23></div><div>  (ReturnStmt 0x105048b70 <col:11, col:20></div><div>    (CXXExprWithTemporaries 0x105048b38 <col:18, col:20> 'class A'</div>

<div>      (CXXTemporary 0x105048a80)</div><div>      (CXXConstructExpr 0x105048af0 <col:18, col:20> 'class A''void (const class A &) throw()' elidable</div><div>        (ImplicitCastExpr 0x105048ad0 <col:18, col:20> 'const class A' <NoOp></div>

<div>          (CXXBindTemporaryExpr 0x105048a88 <col:18, col:20> 'class A' (CXXTemporary 0x105048a80)</div><div>            (CXXTemporaryObjectExpr 0x105048a38 <col:18, col:20> 'class A''void (void)')))))))</div>

</div><div><br></div><div>If we want to <span style="font-family:arial, sans-serif;font-size:13px;white-space:nowrap">ensure that the CFG is constructed from AST with all elidable constructors elided, </span><span style="font-family:arial, sans-serif;font-size:13px;white-space:nowrap">for above example </span><span style="font-family:arial, sans-serif;font-size:13px;white-space:nowrap">we would have to ignore both CXXConstructExpr and CXXBindTemporaryExpr. In your implementation only the first will be elided.</span></div>

</div>
</blockquote></div><br><div>Hi Marcin,</div><div><br></div><div>I still do not understand your point. The current implementation works well for the above example. One block-level expr for CXXTemporaryObjectExpr. One temporary dtor for CXXBindTemporaryExpr.</div>