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">2010/11/13 Zhongxing Xu <span dir="ltr"><<a href="mailto:xuzhongxing@gmail.com">xuzhongxing@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Author: zhongxingxu<br>
Date: Sat Nov 13 01:30:59 2010<br>
New Revision: 118991<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=118991&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=118991&view=rev</a><br>
Log:<br>
Do not add implicit dtors for CXXBindTemporaryExpr with elidable<br>
CXXConstructExpr.<br>
<br>
Modified:<br>
    cfe/trunk/lib/Analysis/CFG.cpp<br>
    cfe/trunk/test/Analysis/temp-obj-dtors-cfg-output.cpp<br>
<br>
Modified: cfe/trunk/lib/Analysis/CFG.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=118991&r1=118990&r2=118991&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=118991&r1=118990&r2=118991&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Analysis/CFG.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/CFG.cpp Sat Nov 13 01:30:59 2010<br>
@@ -2579,11 +2579,18 @@<br>
   return RHSBlock ? RHSBlock : LHSBlock;<br>
 }<br>
<br>
+static bool hasElidableCXXConstructExpr(CXXBindTemporaryExpr *E) {<br>
+  if (CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E->getSubExpr()))<br>
+    if (CE->isElidable())<br>
+      return true;<br>
+  return false;<br>
+}<br>
+<br>
 CFGBlock *CFGBuilder::VisitCXXBindTemporaryExprForTemporaryDtors(<br>
     CXXBindTemporaryExpr *E, bool BindToTemporary) {<br>
   // First add destructors for temporaries in subexpression.<br>
   CFGBlock *B = VisitForTemporaryDtors(E->getSubExpr());<br>
-  if (!BindToTemporary) {<br>
+  if (!BindToTemporary && !hasElidableCXXConstructExpr(E)) {<br>
     // If lifetime of temporary is not prolonged (by assigning to constant<br>
     // reference) add destructor for it.<br>
     autoCreateBlock();<br>
<br>
Modified: cfe/trunk/test/Analysis/temp-obj-dtors-cfg-output.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/temp-obj-dtors-cfg-output.cpp?rev=118991&r1=118990&r2=118991&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/temp-obj-dtors-cfg-output.cpp?rev=118991&r1=118990&r2=118991&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/Analysis/temp-obj-dtors-cfg-output.cpp (original)<br>
+++ cfe/trunk/test/Analysis/temp-obj-dtors-cfg-output.cpp Sat Nov 13 01:30:59 2010<br>
@@ -264,14 +264,11 @@<br>
 // CHECK:    Successors (2): B3 B2<br>
 // CHECK: [ B5 ]<br>
 // CHECK:      1: ~A() (Temporary object destructor)<br>
-// CHECK:      2: ~A() (Temporary object destructor)<br>
 // CHECK:    Predecessors (1): B7<br>
 // CHECK:    Successors (1): B4<br>
 // CHECK: [ B6 ]<br>
 // CHECK:      1: ~A() (Temporary object destructor)<br>
-// CHECK:      2: ~A() (Temporary object destructor)<br>
-// CHECK:      3: ~A() (Temporary object destructor)<br>
-// CHECK:      4: ~B() (Temporary object destructor)<br>
+// CHECK:      2: ~B() (Temporary object destructor)<br>
 // CHECK:    Predecessors (1): B7<br>
 // CHECK:    Successors (1): B4<br>
 // CHECK: [ B7 ]<br>
@@ -311,14 +308,11 @@<br>
 // CHECK:    Successors (1): B0<br>
 // CHECK: [ B2 ]<br>
 // CHECK:      1: ~A() (Temporary object destructor)<br>
-// CHECK:      2: ~A() (Temporary object destructor)<br>
 // CHECK:    Predecessors (1): B4<br>
 // CHECK:    Successors (1): B1<br>
 // CHECK: [ B3 ]<br>
 // CHECK:      1: ~A() (Temporary object destructor)<br>
-// CHECK:      2: ~A() (Temporary object destructor)<br>
-// CHECK:      3: ~A() (Temporary object destructor)<br>
-// CHECK:      4: ~B() (Temporary object destructor)<br>
+// CHECK:      2: ~B() (Temporary object destructor)<br>
 // CHECK:    Predecessors (1): B4<br>
 // CHECK:    Successors (1): B1<br>
 // CHECK: [ B4 ]<br>
@@ -351,8 +345,7 @@<br>
 // CHECK:    Successors (1): B7<br>
 // CHECK: [ B9 ]<br>
 // CHECK:      1: ~A() (Temporary object destructor)<br>
-// CHECK:      2: ~A() (Temporary object destructor)<br>
-// CHECK:      3: ~B() (Temporary object destructor)<br>
+// CHECK:      2: ~B() (Temporary object destructor)<br>
 // CHECK:    Predecessors (1): B10<br>
 // CHECK:    Successors (1): B7<br>
 // CHECK: [ B10 ]<br>
@@ -392,7 +385,6 @@<br>
 // CHECK:    Successors (1): B0<br>
 // CHECK: [ B2 ]<br>
 // CHECK:      1: ~A() (Temporary object destructor)<br>
-// CHECK:      2: ~A() (Temporary object destructor)<br>
 // CHECK:    Predecessors (1): B3<br>
 // CHECK:    Successors (1): B1<br>
 // CHECK: [ B3 ]<br>
@@ -426,7 +418,6 @@<br>
 // CHECK:    Successors (1): B0<br>
 // CHECK: [ B2 ]<br>
 // CHECK:      1: ~A() (Temporary object destructor)<br>
-// CHECK:      2: ~A() (Temporary object destructor)<br>
 // CHECK:    Predecessors (1): B3<br>
 // CHECK:    Successors (1): B1<br>
 // CHECK: [ B3 ]<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>