Skip to content
Snippets Groups Projects
Commit ddfc8a1e authored by Fariborz Jahanian's avatar Fariborz Jahanian
Browse files

objc-arc: captured block variable accessed in its block literal

initializer need be null initialized before initializer takes
hold, just like any other initialized retainable object pointer. 
// rdar://11016025


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158738 91177308-0d34-0410-b5e6-96231b3b80d8
parent c9480dd0
No related branches found
No related tags found
No related merge requests found
......@@ -490,6 +490,14 @@ static bool isAccessedBy(const VarDecl &var, const Stmt *s) {
if (const DeclRefExpr *ref = dyn_cast<DeclRefExpr>(e))
return (ref->getDecl() == &var);
if (const BlockExpr *be = dyn_cast<BlockExpr>(e)) {
const BlockDecl *block = be->getBlockDecl();
for (BlockDecl::capture_const_iterator i = block->capture_begin(),
e = block->capture_end(); i != e; ++i) {
if (i->getVariable() == &var)
return true;
}
}
}
for (Stmt::const_child_range children = s->children(); children; ++children)
......
......@@ -521,3 +521,14 @@ void test15_helper(void (^block)(void), int x);
void test15(int a) {
test15_helper(^{ (void) a; }, ({ a; }));
}
// rdar://11016025
void test16() {
void (^BLKVAR)(void) = ^{ BLKVAR(); };
// CHECK: define void @test16(
// CHECK: [[BLKVAR:%.*]] = alloca void ()*, align 8
// CHECK-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
// CHECK-NEXT: [[SLOTREL:%.*]] = getelementptr inbounds [[BLOCK_T]]* [[BLOCK]], i32 0, i32 5
// CHECK-NEXT: store void ()* null, void ()** [[BLKVAR]], align 8
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment