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>