teak-llvm/clang/test/CodeGenObjC/arc-block-copy-escape.m
Akira Hatanaka c5792aa90f Avoid needlessly copying a block to the heap when a block literal
initializes a local auto variable or is assigned to a local auto
variable that is declared in the scope that introduced the block
literal.

rdar://problem/13289333

https://reviews.llvm.org/D58514

llvm-svn: 355012
2019-02-27 18:17:16 +00:00

25 lines
642 B
Objective-C

// RUN: %clang_cc1 -fobjc-arc -fblocks -emit-llvm %s -o - | FileCheck %s
typedef void (^block_t)(void);
void use_block(block_t);
void use_int(int);
// rdar://problem/10211676
void test0(int i) {
block_t block = ^{ use_int(i); };
// CHECK-LABEL: define {{.*}}void @test0(
// CHECK-NOT: @llvm.objc.retainBlock(
// CHECK: ret void
}
void test1(int i) {
id block = ^{ use_int(i); };
// CHECK-LABEL: define {{.*}}void @test1(
// CHECK: call {{.*}}i8* @llvm.objc.retainBlock(i8* {{%.*}}) [[NUW:#[0-9]+]]
// CHECK-NOT: !clang.arc.copy_on_escape
// CHECK: ret void
}
// CHECK: attributes [[NUW]] = { nounwind }