From 9154b5dffe4ffa014c65f4629a8429c4b166e3b3 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 17 May 2010 15:52:46 +0000 Subject: Ensure that destructors are called for NRVO'd objects when the function does not return. Thanks to Eli for pointing out this corner case. llvm-svn: 103941 --- clang/lib/CodeGen/CGStmt.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'clang/lib/CodeGen/CGStmt.cpp') diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp index f51a899e7ff..496fd2fe1fb 100644 --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/lib/CodeGen/CGStmt.cpp @@ -612,6 +612,14 @@ void CodeGenFunction::EmitReturnStmt(const ReturnStmt &S) { // Apply the named return value optimization for this return statement, // which means doing nothing: the appropriate result has already been // constructed into the NRVO variable. + + // If there is an NRVO flag for this variable, set it to 1 into indicate + // that the cleanup code should not destroy the variable. + if (llvm::Value *NRVOFlag = NRVOFlags[S.getNRVOCandidate()]) { + const llvm::Type *BoolTy = llvm::Type::getInt1Ty(VMContext); + llvm::Value *One = llvm::ConstantInt::get(BoolTy, 1); + Builder.CreateStore(One, NRVOFlag); + } } else if (!ReturnValue) { // Make sure not to return anything, but evaluate the expression // for side effects. -- cgit v1.2.3