aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExprCXX.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2012-02-14 02:31:03 +0000
committerEli Friedman <eli.friedman@gmail.com>2012-02-14 02:31:03 +0000
commitb74ed087469db042325bad76fdf3ff6ed67dec09 (patch)
tree62ab000636f8297cf37a48b6cdfbf20fe4149726 /lib/CodeGen/CGExprCXX.cpp
parent0bdb5aa1a3384d194b0e14a9ecbe3309ff33daa3 (diff)
Implement IRGen of lambda expressions which capture arrays.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150452 91177308-0d34-0410-b5e6-96231b3b80d8
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);
}
}