This fixes a nasty miscompile, please pull to the branch.<br><br><div class="gmail_quote">On Thu, May 30, 2013 at 3:40 PM, Richard Smith <span dir="ltr"><<a href="mailto:richard-llvm@metafoo.co.uk" target="_blank">richard-llvm@metafoo.co.uk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rsmith<br>
Date: Thu May 30 17:40:16 2013<br>
New Revision: 182969<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=182969&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=182969&view=rev</a><br>
Log:<br>
Walk over MaterializeTemporaryExpr when reverting an initializer to its<br>
syntactic form in template instantiation. Previously, this blocked the<br>
reversion and we ended up losing inner CXXBindTemporaryExprs (and thus<br>
forgetting to call destructors!).<br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/TreeTransform.h<br>
    cfe/trunk/test/CodeGenCXX/cxx0x-initializer-constructors.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/TreeTransform.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=182969&r1=182968&r2=182969&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=182969&r1=182968&r2=182969&view=diff</a><br>

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

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