summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGExpr.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-02-09 03:32:31 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-02-09 03:32:31 +0000
commitc370a7eec7814d1564ec11ed71d72016029aba99 (patch)
tree5cb29c7bf849765409230ee0452c11dbf6b805ba /clang/lib/CodeGen/CGExpr.cpp
parent5a294e6a2c116010f8cb88a5e020b30888e8c642 (diff)
downloadbcm5719-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.cpp47
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());
}
OpenPOWER on IntegriCloud