This fixes a nasty miscompile, please pull to the branch. On Thu, May 30, 2013 at 3:40 PM, Richard Smith <[email protected]>wrote:
> 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( > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
