]> granicus.if.org Git - clang/commitdiff
Revert r118991.
authorZhongxing Xu <xuzhongxing@gmail.com>
Sun, 14 Nov 2010 15:23:50 +0000 (15:23 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Sun, 14 Nov 2010 15:23:50 +0000 (15:23 +0000)
Elidable CXXConstructExpr should inhibit calling destructor for temporary
that is copied, not the one created. This is because eliding copy constructor
means that the object that was to be copied will be constructed directly in
memory the copy would be constructed in.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119044 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFG.cpp
test/Analysis/temp-obj-dtors-cfg-output.cpp

index 42e081628d88c3d6c0d0f2e9b7400cedf8cd21f7..ef67d3b9576bb7575127361ef6cf9f3773325530 100644 (file)
@@ -2579,18 +2579,11 @@ CFGBlock *CFGBuilder::VisitBinaryOperatorForTemporaryDtors(BinaryOperator *E) {
   return RHSBlock ? RHSBlock : LHSBlock;
 }
 
-static bool hasElidableCXXConstructExpr(CXXBindTemporaryExpr *E) {
-  if (CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E->getSubExpr()))
-    if (CE->isElidable())
-      return true;
-  return false;
-}
-
 CFGBlock *CFGBuilder::VisitCXXBindTemporaryExprForTemporaryDtors(
     CXXBindTemporaryExpr *E, bool BindToTemporary) {
   // First add destructors for temporaries in subexpression.
   CFGBlock *B = VisitForTemporaryDtors(E->getSubExpr());
-  if (!BindToTemporary && !hasElidableCXXConstructExpr(E)) {
+  if (!BindToTemporary) {
     // If lifetime of temporary is not prolonged (by assigning to constant
     // reference) add destructor for it.
     autoCreateBlock();
index adf509be5b5532469d43ec8a39a4c01c278ad043..594c91b595d964800ec5ab34ed9b05873ecbf9e4 100644 (file)
@@ -264,11 +264,14 @@ TestCtorInits::TestCtorInits()
 // CHECK:    Successors (2): B3 B2
 // CHECK: [ B5 ]
 // CHECK:      1: ~A() (Temporary object destructor)
+// CHECK:      2: ~A() (Temporary object destructor)
 // CHECK:    Predecessors (1): B7
 // CHECK:    Successors (1): B4
 // CHECK: [ B6 ]
 // CHECK:      1: ~A() (Temporary object destructor)
-// CHECK:      2: ~B() (Temporary object destructor)
+// CHECK:      2: ~A() (Temporary object destructor)
+// CHECK:      3: ~A() (Temporary object destructor)
+// CHECK:      4: ~B() (Temporary object destructor)
 // CHECK:    Predecessors (1): B7
 // CHECK:    Successors (1): B4
 // CHECK: [ B7 ]
@@ -308,11 +311,14 @@ TestCtorInits::TestCtorInits()
 // CHECK:    Successors (1): B0
 // CHECK: [ B2 ]
 // CHECK:      1: ~A() (Temporary object destructor)
+// CHECK:      2: ~A() (Temporary object destructor)
 // CHECK:    Predecessors (1): B4
 // CHECK:    Successors (1): B1
 // CHECK: [ B3 ]
 // CHECK:      1: ~A() (Temporary object destructor)
-// CHECK:      2: ~B() (Temporary object destructor)
+// CHECK:      2: ~A() (Temporary object destructor)
+// CHECK:      3: ~A() (Temporary object destructor)
+// CHECK:      4: ~B() (Temporary object destructor)
 // CHECK:    Predecessors (1): B4
 // CHECK:    Successors (1): B1
 // CHECK: [ B4 ]
@@ -345,7 +351,8 @@ TestCtorInits::TestCtorInits()
 // CHECK:    Successors (1): B7
 // CHECK: [ B9 ]
 // CHECK:      1: ~A() (Temporary object destructor)
-// CHECK:      2: ~B() (Temporary object destructor)
+// CHECK:      2: ~A() (Temporary object destructor)
+// CHECK:      3: ~B() (Temporary object destructor)
 // CHECK:    Predecessors (1): B10
 // CHECK:    Successors (1): B7
 // CHECK: [ B10 ]
@@ -385,6 +392,7 @@ TestCtorInits::TestCtorInits()
 // CHECK:    Successors (1): B0
 // CHECK: [ B2 ]
 // CHECK:      1: ~A() (Temporary object destructor)
+// CHECK:      2: ~A() (Temporary object destructor)
 // CHECK:    Predecessors (1): B3
 // CHECK:    Successors (1): B1
 // CHECK: [ B3 ]
@@ -418,6 +426,7 @@ TestCtorInits::TestCtorInits()
 // CHECK:    Successors (1): B0
 // CHECK: [ B2 ]
 // CHECK:      1: ~A() (Temporary object destructor)
+// CHECK:      2: ~A() (Temporary object destructor)
 // CHECK:    Predecessors (1): B3
 // CHECK:    Successors (1): B1
 // CHECK: [ B3 ]