]> granicus.if.org Git - clang/commitdiff
Walk over MaterializeTemporaryExpr when reverting an initializer to its
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 30 May 2013 22:40:16 +0000 (22:40 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 30 May 2013 22:40:16 +0000 (22:40 +0000)
syntactic form in template instantiation. Previously, this blocked the
reversion and we ended up losing inner CXXBindTemporaryExprs (and thus
forgetting to call destructors!).

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

lib/Sema/TreeTransform.h
test/CodeGenCXX/cxx0x-initializer-constructors.cpp

index 7f3a7d7540a48874f6c05a6399c72f7757f6f619..4ebcfa292f2edae90926ea4f01866214735f336e 100644 (file)
@@ -2630,6 +2630,9 @@ ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
   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();
 
index be5b44df1fec551df4bee879bd8956fe083c8d72..efbf318b8178a865770cef2ed38d9e4d9a908d21 100644 (file)
@@ -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(
+}