diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2012-02-09 03:32:31 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2012-02-09 03:32:31 +0000 |
commit | c370a7eec7814d1564ec11ed71d72016029aba99 (patch) | |
tree | 5cb29c7bf849765409230ee0452c11dbf6b805ba /clang/lib/CodeGen/CGExpr.cpp | |
parent | 5a294e6a2c116010f8cb88a5e020b30888e8c642 (diff) | |
download | bcm5719-llvm-c370a7eec7814d1564ec11ed71d72016029aba99.tar.gz bcm5719-llvm-c370a7eec7814d1564ec11ed71d72016029aba99.zip |
Refactor lambda IRGen so AggExprEmitter::VisitLambdaExpr does the right thing.
llvm-svn: 150146
Diffstat (limited to 'clang/lib/CodeGen/CGExpr.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 47 |
1 files changed, 1 insertions, 46 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index e309571eff5..85b01387e83 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -2361,55 +2361,10 @@ CodeGenFunction::EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *E) { return MakeAddrLValue(Slot.getAddr(), E->getType()); } -namespace { - struct CallLambdaMemberDtor : EHScopeStack::Cleanup { - FieldDecl *Field; - CXXDestructorDecl *Dtor; - llvm::Value *Lambda; - - CallLambdaMemberDtor(FieldDecl *Field, CXXDestructorDecl *Dtor, - llvm::Value *Lambda) - : Field(Field), Dtor(Dtor), Lambda(Lambda) {} - - void Emit(CodeGenFunction &CGF, Flags flags) { - LValue LHS = CGF.EmitLValueForField(Lambda, Field, 0); - CGF.EmitCXXDestructorCall(Dtor, Dtor_Complete, /*ForVirtualBase=*/false, - LHS.getAddress()); - } - }; -} - LValue CodeGenFunction::EmitLambdaLValue(const LambdaExpr *E) { AggValueSlot Slot = CreateAggTemp(E->getType(), "temp.lvalue"); - - EHScopeStack::stable_iterator CleanupDepth = EHStack.stable_begin(); - CXXRecordDecl::field_iterator CurField = E->getLambdaClass()->field_begin(); - for (LambdaExpr::capture_init_iterator i = E->capture_init_begin(), - e = E->capture_init_end(); - i != e; ++i, ++CurField) { - // FIXME: Add array handling - // FIXME: Try to refactor with CodeGenFunction::EmitCtorPrologue - - // Emit initialization - LValue LV = EmitLValueForFieldInitialization(Slot.getAddr(), *CurField, 0); - EmitExprAsInit(*i, *CurField, LV, false); - - // Add temporary cleanup to handle the case where a later initialization - // throws. - if (!CGM.getLangOptions().Exceptions) - continue; - const RecordType *RT = CurField->getType()->getAs<RecordType>(); - if (!RT) - continue; - CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); - if (!RD->hasTrivialDestructor()) - EHStack.pushCleanup<CallLambdaMemberDtor>(EHCleanup, *CurField, - RD->getDestructor(), - Slot.getAddr()); - } - PopCleanupBlocks(CleanupDepth); - + EmitLambdaExpr(E, Slot); return MakeAddrLValue(Slot.getAddr(), E->getType()); } |