[cfe-commits] r118991 - in /cfe/trunk: lib/Analysis/CFG.cpp test/Analysis/temp-obj-dtors-cfg-output.cpp

Marcin Świderski marcin.sfider at gmail.com
Sat Nov 13 03:34:08 PST 2010


Hi Zhongxing

Won't it lead to unbalancing ctors/dtors like I've written in discusion
after commit r118159?

2010/11/13 Zhongxing Xu <xuzhongxing at gmail.com>

> Author: zhongxingxu
> Date: Sat Nov 13 01:30:59 2010
> New Revision: 118991
>
> URL: http://llvm.org/viewvc/llvm-project?rev=118991&view=rev
> Log:
> Do not add implicit dtors for CXXBindTemporaryExpr with elidable
> CXXConstructExpr.
>
> Modified:
>    cfe/trunk/lib/Analysis/CFG.cpp
>    cfe/trunk/test/Analysis/temp-obj-dtors-cfg-output.cpp
>
> Modified: cfe/trunk/lib/Analysis/CFG.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=118991&r1=118990&r2=118991&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Analysis/CFG.cpp (original)
> +++ cfe/trunk/lib/Analysis/CFG.cpp Sat Nov 13 01:30:59 2010
> @@ -2579,11 +2579,18 @@
>   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) {
> +  if (!BindToTemporary && !hasElidableCXXConstructExpr(E)) {
>     // If lifetime of temporary is not prolonged (by assigning to constant
>     // reference) add destructor for it.
>     autoCreateBlock();
>
> Modified: cfe/trunk/test/Analysis/temp-obj-dtors-cfg-output.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/temp-obj-dtors-cfg-output.cpp?rev=118991&r1=118990&r2=118991&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Analysis/temp-obj-dtors-cfg-output.cpp (original)
> +++ cfe/trunk/test/Analysis/temp-obj-dtors-cfg-output.cpp Sat Nov 13
> 01:30:59 2010
> @@ -264,14 +264,11 @@
>  // 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: ~A() (Temporary object destructor)
> -// CHECK:      3: ~A() (Temporary object destructor)
> -// CHECK:      4: ~B() (Temporary object destructor)
> +// CHECK:      2: ~B() (Temporary object destructor)
>  // CHECK:    Predecessors (1): B7
>  // CHECK:    Successors (1): B4
>  // CHECK: [ B7 ]
> @@ -311,14 +308,11 @@
>  // 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: ~A() (Temporary object destructor)
> -// CHECK:      3: ~A() (Temporary object destructor)
> -// CHECK:      4: ~B() (Temporary object destructor)
> +// CHECK:      2: ~B() (Temporary object destructor)
>  // CHECK:    Predecessors (1): B4
>  // CHECK:    Successors (1): B1
>  // CHECK: [ B4 ]
> @@ -351,8 +345,7 @@
>  // CHECK:    Successors (1): B7
>  // CHECK: [ B9 ]
>  // CHECK:      1: ~A() (Temporary object destructor)
> -// CHECK:      2: ~A() (Temporary object destructor)
> -// CHECK:      3: ~B() (Temporary object destructor)
> +// CHECK:      2: ~B() (Temporary object destructor)
>  // CHECK:    Predecessors (1): B10
>  // CHECK:    Successors (1): B7
>  // CHECK: [ B10 ]
> @@ -392,7 +385,6 @@
>  // 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 ]
> @@ -426,7 +418,6 @@
>  // 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 ]
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20101113/466a9de8/attachment.html>


More information about the cfe-commits mailing list