Fix the determination of whether a capture refers to an enclosing
scope when dealing with nested blocks. Fixes <rdar://problem/12778708>. llvm-svn: 169065
This commit is contained in:
parent
640a126d81
commit
c401755f46
|
@ -10836,9 +10836,10 @@ bool Sema::tryCaptureVariable(VarDecl *Var, SourceLocation Loc,
|
||||||
// According to the blocks spec, the capture of a variable from
|
// According to the blocks spec, the capture of a variable from
|
||||||
// the stack requires a const copy constructor. This is not true
|
// the stack requires a const copy constructor. This is not true
|
||||||
// of the copy/move done to move a __block variable to the heap.
|
// of the copy/move done to move a __block variable to the heap.
|
||||||
Expr *DeclRef = new (Context) DeclRefExpr(Var, false,
|
Expr *DeclRef = new (Context) DeclRefExpr(Var, Nested,
|
||||||
DeclRefType.withConst(),
|
DeclRefType.withConst(),
|
||||||
VK_LValue, Loc);
|
VK_LValue, Loc);
|
||||||
|
|
||||||
ExprResult Result
|
ExprResult Result
|
||||||
= PerformCopyInitialization(
|
= PerformCopyInitialization(
|
||||||
InitializedEntity::InitializeBlock(Var->getLocation(),
|
InitializedEntity::InitializeBlock(Var->getLocation(),
|
||||||
|
@ -10923,7 +10924,7 @@ bool Sema::tryCaptureVariable(VarDecl *Var, SourceLocation Loc,
|
||||||
if (BuildAndDiagnose) {
|
if (BuildAndDiagnose) {
|
||||||
ExprResult Result = captureInLambda(*this, LSI, Var, CaptureType,
|
ExprResult Result = captureInLambda(*this, LSI, Var, CaptureType,
|
||||||
DeclRefType, Loc,
|
DeclRefType, Loc,
|
||||||
I == N-1);
|
Nested);
|
||||||
if (!Result.isInvalid())
|
if (!Result.isInvalid())
|
||||||
CopyExpr = Result.take();
|
CopyExpr = Result.take();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -emit-llvm -o - %s -fexceptions -std=c++11 | FileCheck %s
|
// RUN: %clang_cc1 -triple x86_64-apple-darwin10.0.0 -fblocks -emit-llvm -o - %s -fexceptions -std=c++11 | FileCheck %s
|
||||||
|
|
||||||
// CHECK-NOT: @unused
|
// CHECK-NOT: @unused
|
||||||
auto unused = [](int i) { return i+1; };
|
auto unused = [](int i) { return i+1; };
|
||||||
|
@ -89,3 +89,14 @@ int g() {
|
||||||
// CHECK-NEXT: ret i32
|
// CHECK-NEXT: ret i32
|
||||||
|
|
||||||
// CHECK: define internal void @"_ZZ1e1ES_bEN3$_4D2Ev"
|
// CHECK: define internal void @"_ZZ1e1ES_bEN3$_4D2Ev"
|
||||||
|
|
||||||
|
// <rdar://problem/12778708>
|
||||||
|
struct XXX {};
|
||||||
|
void nestedCapture () {
|
||||||
|
XXX localKey;
|
||||||
|
^() {
|
||||||
|
[&]() {
|
||||||
|
^{ XXX k = localKey; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue