r182969 - Walk over MaterializeTemporaryExpr when reverting an initializer to its

Richard Smith richard-llvm at metafoo.co.uk
Thu May 30 15:40:16 PDT 2013


Author: rsmith
Date: Thu May 30 17:40:16 2013
New Revision: 182969

URL: http://llvm.org/viewvc/llvm-project?rev=182969&view=rev
Log:
Walk over MaterializeTemporaryExpr when reverting an initializer to its
syntactic form in template instantiation. Previously, this blocked the
reversion and we ended up losing inner CXXBindTemporaryExprs (and thus
forgetting to call destructors!).

Modified:
    cfe/trunk/lib/Sema/TreeTransform.h
    cfe/trunk/test/CodeGenCXX/cxx0x-initializer-constructors.cpp

Modified: cfe/trunk/lib/Sema/TreeTransform.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=182969&r1=182968&r2=182969&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/TreeTransform.h (original)
+++ cfe/trunk/lib/Sema/TreeTransform.h Thu May 30 17:40:16 2013
@@ -2630,6 +2630,9 @@ ExprResult TreeTransform<Derived>::Trans
   if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init))
     Init = ExprTemp->getSubExpr();
 
+  if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
+    Init = MTE->GetTemporaryExpr();
+
   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
     Init = Binder->getSubExpr();
 

Modified: cfe/trunk/test/CodeGenCXX/cxx0x-initializer-constructors.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx0x-initializer-constructors.cpp?rev=182969&r1=182968&r2=182969&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/cxx0x-initializer-constructors.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/cxx0x-initializer-constructors.cpp Thu May 30 17:40:16 2013
@@ -35,3 +35,19 @@ void fn4() {
   // CHECK: call void @_ZN1SC1Eidd(%struct.S* %{{.+}}, i32 1, double 2.000000e+00, double 3.000000e+00)
   // CHECK: call void @_ZN1SC1Eidd(%struct.S* %{{.+}}, i32 4, double 5.000000e+00, double 6.000000e+00)
 }
+
+namespace TreeTransformBracedInit {
+  struct S {};
+  struct T { T(const S &); T(const T&); ~T(); };
+  void x(const T &);
+  template<typename> void foo(const S &s) {
+    // Instantiation of this expression used to lose the CXXBindTemporaryExpr
+    // node and thus not destroy the temporary.
+    x({s});
+  }
+  template void foo<void>(const S&);
+  // CHECK: define {{.*}} void @_ZN23TreeTransformBracedInit3fooIvEEvRKNS_1SE(
+  // CHECK: call void @_ZN23TreeTransformBracedInit1TC1ERKNS_1SE(
+  // CHECK-NEXT: call void @_ZN23TreeTransformBracedInit1xERKNS_1TE(
+  // CHECK-NEXT: call void @_ZN23TreeTransformBracedInit1TD1Ev(
+}





More information about the cfe-commits mailing list