diff options
Diffstat (limited to 'lib/CodeGen/CGExprCXX.cpp')
-rw-r--r-- | lib/CodeGen/CGExprCXX.cpp | 39 |
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); } } |