aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprCXX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/CGExprCXX.cpp')
-rw-r--r--lib/CodeGen/CGExprCXX.cpp39
1 files changed, 4 insertions, 35 deletions
diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp
index 673c9442e0..7b1ae1cc24 100644
--- a/lib/CodeGen/CGExprCXX.cpp
+++ b/lib/CodeGen/CGExprCXX.cpp
@@ -1765,24 +1765,6 @@ llvm::Value *CodeGenFunction::EmitDynamicCast(llvm::Value *Value,
return Value;
}
-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());
- }
- };
-}
-
void CodeGenFunction::EmitLambdaExpr(const LambdaExpr *E, AggValueSlot Slot) {
RunCleanupsScope Scope(*this);
@@ -1790,24 +1772,11 @@ void CodeGenFunction::EmitLambdaExpr(const LambdaExpr *E, AggValueSlot Slot) {
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());
+ ArrayRef<VarDecl *> ArrayIndexes;
+ if (CurField->getType()->isArrayType())
+ ArrayIndexes = E->getCaptureInitIndexVars(i);
+ EmitInitializerForField(*CurField, LV, *i, ArrayIndexes);
}
}