[cfe-commits] r86230 - in /cfe/trunk: lib/CodeGen/CodeGenFunction.cpp test/CodeGenCXX/temporaries.cpp

Anders Carlsson andersca at mac.com
Thu Nov 5 20:19:03 PST 2009


Author: andersca
Date: Thu Nov  5 22:19:02 2009
New Revision: 86230

URL: http://llvm.org/viewvc/llvm-project?rev=86230&view=rev
Log:
If a member variable of reference type is bound to a temporary in its member initializer it needs to be destroyed at the end of the constructor.

Modified:
    cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
    cfe/trunk/test/CodeGenCXX/temporaries.cpp

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=86230&r1=86229&r2=86230&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Thu Nov  5 22:19:02 2009
@@ -264,6 +264,11 @@
     if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD)) {
       EmitCtorPrologue(CD, GD.getCtorType());
       EmitStmt(S);
+      
+      // If any of the member initializers are temporaries bound to references
+      // make sure to emit their destructors.
+      EmitCleanupBlocks(0);
+      
     } else if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(FD)) {
       llvm::BasicBlock *DtorEpilogue  = createBasicBlock("dtor.epilogue");
       PushCleanupBlock(DtorEpilogue);

Modified: cfe/trunk/test/CodeGenCXX/temporaries.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/temporaries.cpp?rev=86230&r1=86229&r2=86230&view=diff

==============================================================================
--- cfe/trunk/test/CodeGenCXX/temporaries.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/temporaries.cpp Thu Nov  5 22:19:02 2009
@@ -131,6 +131,7 @@
   int a1;
   int a2;
   B();
+  ~B();
 };
 
 B::B()
@@ -147,4 +148,20 @@
   f();
 }
   
+struct C {
+  C();
+  
+  const B& b;
+};
+
+C::C() 
+  // CHECK: call void @_ZN6PR50771BC1Ev
+  : b(B()) {
+  // CHECK: call void @_ZN6PR50771fEv
+  f();
+  
+  // CHECK: call void @_ZN6PR50771BD1Ev
+}
+
+
 }





More information about the cfe-commits mailing list