From: Anders Carlsson Date: Fri, 6 Nov 2009 04:11:09 +0000 (+0000) Subject: If a member initializer create temporaries we need to destroy them. Fixes PR5077. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1faf67478c6d423880726a327c737db13b8d9f0b;p=clang If a member initializer create temporaries we need to destroy them. Fixes PR5077. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86225 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 029fdedb50..0e6b5cb143 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -1468,10 +1468,17 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD, B != E; ++B) { CXXBaseOrMemberInitializer *Member = (*B); + assert(LiveTemporaries.empty() && + "Should not have any live temporaries at initializer start!"); + if (Member->isBaseInitializer()) EmitBaseInitializer(*this, ClassDecl, Member, CtorType); else EmitMemberInitializer(*this, ClassDecl, Member); + + // Pop any live temporaries that the initializers might have pushed. + while (!LiveTemporaries.empty()) + PopCXXTemporary(); } if (!CD->getNumBaseOrMemberInitializers() && !CD->isTrivial()) { diff --git a/test/CodeGenCXX/temporaries.cpp b/test/CodeGenCXX/temporaries.cpp index e9ed0f7690..5366612001 100644 --- a/test/CodeGenCXX/temporaries.cpp +++ b/test/CodeGenCXX/temporaries.cpp @@ -115,3 +115,36 @@ void f7() { // CHECK: call void @_ZN1GD1Ev a(G()); } + +namespace PR5077 { + +struct A { + A(); + ~A(); + int f(); +}; + +void f(); +int g(const A&); + +struct B { + int a1; + int a2; + B(); +}; + +B::B() + // CHECK: call void @_ZN6PR50771AC1Ev + // CHECK: call i32 @_ZN6PR50771A1fEv + // CHECK: call void @_ZN6PR50771AD1Ev + : a1(A().f()) + // CHECK: call void @_ZN6PR50771AC1Ev + // CHECK: call i32 @_ZN6PR50771gERKNS_1AE + // CHECK: call void @_ZN6PR50771AD1Ev + , a2(g(A())) +{ + // CHECK: call void @_ZN6PR50771fEv + f(); +} + +}