// RUN: %clang_cc1 -triple x86_64-apple-darwin -fblocks -fno-escaping-block-tail-calls -emit-llvm -o - %s | FileCheck %s // CHECK-LABEL: define{{.*}} void @test( // CHECK: store i8* bitcast (void (i8*)* @[[TEST_BLOCK_INVOKE0:.*]] to i8*) // CHECK: store i8* bitcast (void (i8*)* @[[TEST_BLOCK_INVOKE1:.*]] to i8*) // CHECK: store i8* bitcast (void (i8*)* @[[TEST_BLOCK_INVOKE2:.*]] to i8*) // CHECK: store i8* bitcast (void (i8*)* @[[TEST_BLOCK_INVOKE3:.*]] to i8*) // CHECK: store i8* bitcast (void (i8*)* @[[TEST_BLOCK_INVOKE4:.*]] to i8*) // CHECK: store i8* bitcast (void (i8*)* @[[TEST_BLOCK_INVOKE5:.*]] to i8*) // CHECK: store i8* bitcast (void (i8*)* @[[TEST_BLOCK_INVOKE6:.*]] to i8*) // CHECK: define internal void @[[TEST_BLOCK_INVOKE0]]({{.*}}) #[[DISABLEATTR:.*]] { // CHECK: define internal void @[[TEST_BLOCK_INVOKE1]]({{.*}}) #[[ENABLEATTR:.*]] { // CHECK: define internal void @[[TEST_BLOCK_INVOKE2]]({{.*}}) #[[DISABLEATTR]] { // CHECK: define internal void @[[TEST_BLOCK_INVOKE3]]({{.*}}) #[[DISABLEATTR]] { // CHECK: define internal void @[[TEST_BLOCK_INVOKE4]]({{.*}}) #[[ENABLEATTR]] { // CHECK: define internal void @[[TEST_BLOCK_INVOKE5]]({{.*}}) #[[DISABLEATTR]] { // CHECK: define internal void @[[TEST_BLOCK_INVOKE6]]({{.*}}) #[[ENABLEATTR]] { // CHECK: attributes #[[ENABLEATTR]] = {{{.*}}"disable-tail-calls"="false"{{.*}}} // CHECK: attributes #[[DISABLEATTR]] = {{{.*}}"disable-tail-calls"="true"{{.*}}} typedef void (^BlockTy)(void); typedef void (*NoEscapeFnTy)(__attribute__((noescape)) BlockTy); void callee0(__attribute__((noescape)) BlockTy); void callee1(BlockTy); __attribute__((objc_root_class)) @interface C0 -(void)m0:(__attribute__((noescape)) BlockTy)p; -(void)m1:(BlockTy)p; @end @implementation C0 -(void)m0:(__attribute__((noescape)) BlockTy)p {} -(void)m1:(BlockTy)p {} @end NoEscapeFnTy noescapefunc; void test(id a, C0 *c0) { BlockTy b0 = ^{ (void)a; }; // disable tail-call optimization. callee0(b0); callee0(^{ (void)a; }); // enable tail-call optimization. callee1(^{ (void)a; }); // disable tail-call optimization. BlockTy b1 = ^{ (void)a; }; // disable tail-call optimization. [c0 m0:b1]; [c0 m0:^{ (void)a; }]; // enable tail-call optimization. [c0 m1:^{ (void)a; }]; // disable tail-call optimization. noescapefunc(^{ (void)a; }); // enable tail-call optimization. }