//===--- CGCXXTemp.cpp - Emit LLVM Code for C++ temporaries ---------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This contains code dealing with C++ code generation of temporaries // //===----------------------------------------------------------------------===// #include "CodeGenFunction.h" using namespace clang; using namespace CodeGen; void CodeGenFunction::PushCXXTemporary(const CXXTemporary *Temporary, llvm::Value *Ptr) { LiveTemporaries.push_back(CXXLiveTemporaryInfo(Temporary, Ptr, 0, 0)); // Make a cleanup scope and emit the destructor. { CleanupScope Scope(*this); EmitCXXDestructorCall(Temporary->getDestructor(), Dtor_Complete, Ptr); } } RValue CodeGenFunction::EmitCXXExprWithTemporaries(const CXXExprWithTemporaries *E, llvm::Value *AggLoc, bool isAggLocVolatile) { // Keep track of the current cleanup stack depth. size_t CleanupStackDepth = CleanupEntries.size(); unsigned OldNumLiveTemporaries = LiveTemporaries.size(); RValue RV = EmitAnyExpr(E->getSubExpr(), AggLoc, isAggLocVolatile); // Go through the temporaries backwards. for (unsigned i = E->getNumTemporaries(); i != 0; --i) { assert(LiveTemporaries.back().Temporary == E->getTemporary(i - 1)); LiveTemporaries.pop_back(); } assert(OldNumLiveTemporaries == LiveTemporaries.size() && "Live temporary stack mismatch!"); EmitCleanupBlocks(CleanupStackDepth); return RV; }