forked from OSchip/llvm-project
72 lines
2.1 KiB
Objective-C
72 lines
2.1 KiB
Objective-C
// RUN: %clang_cc1 -triple x86_64-apple-darwin -fblocks -emit-llvm -o - %s | FileCheck %s
|
|
|
|
typedef void (^BlockTy)(void);
|
|
|
|
union U {
|
|
int *i;
|
|
long long *ll;
|
|
} __attribute__((transparent_union));
|
|
|
|
void noescapeFunc0(id, __attribute__((noescape)) BlockTy);
|
|
void noescapeFunc1(__attribute__((noescape)) int *);
|
|
void noescapeFunc2(__attribute__((noescape)) id);
|
|
void noescapeFunc3(__attribute__((noescape)) union U);
|
|
|
|
// CHECK-LABEL: define void @test0(
|
|
// CHECK: call void @noescapeFunc0({{.*}}, {{.*}} nocapture {{.*}})
|
|
// CHECK: declare void @noescapeFunc0(i8*, {{.*}} nocapture)
|
|
void test0(BlockTy b) {
|
|
noescapeFunc0(0, b);
|
|
}
|
|
|
|
// CHECK-LABEL: define void @test1(
|
|
// CHECK: call void @noescapeFunc1({{.*}} nocapture {{.*}})
|
|
// CHECK: declare void @noescapeFunc1({{.*}} nocapture)
|
|
void test1(int *i) {
|
|
noescapeFunc1(i);
|
|
}
|
|
|
|
// CHECK-LABEL: define void @test2(
|
|
// CHECK: call void @noescapeFunc2({{.*}} nocapture {{.*}})
|
|
// CHECK: declare void @noescapeFunc2({{.*}} nocapture)
|
|
void test2(id i) {
|
|
noescapeFunc2(i);
|
|
}
|
|
|
|
// CHECK-LABEL: define void @test3(
|
|
// CHECK: call void @noescapeFunc3({{.*}} nocapture {{.*}})
|
|
// CHECK: declare void @noescapeFunc3({{.*}} nocapture)
|
|
void test3(union U u) {
|
|
noescapeFunc3(u);
|
|
}
|
|
|
|
// CHECK: define internal void @"\01-[C0 m0:]"({{.*}}, {{.*}}, {{.*}} nocapture {{.*}})
|
|
|
|
// CHECK-LABEL: define void @test4(
|
|
// CHECK: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i32*)*)(i8* {{.*}}, i8* {{.*}}, i32* nocapture {{.*}})
|
|
|
|
@interface C0
|
|
-(void) m0:(int*)__attribute__((noescape)) p0;
|
|
@end
|
|
|
|
@implementation C0
|
|
-(void) m0:(int*)__attribute__((noescape)) p0 {
|
|
}
|
|
@end
|
|
|
|
void test4(C0 *c0, int *p) {
|
|
[c0 m0:p];
|
|
}
|
|
|
|
// CHECK-LABEL: define void @test5(
|
|
// CHECK: call void {{.*}}(i8* bitcast ({ i8**, i32, i32, i8*, {{.*}} }* @{{.*}} to i8*), i32* nocapture {{.*}})
|
|
// CHECK: call void {{.*}}(i8* {{.*}}, i32* nocapture {{.*}})
|
|
// CHECK: define internal void @{{.*}}(i8* {{.*}}, i32* nocapture {{.*}})
|
|
|
|
typedef void (^BlockTy2)(__attribute__((noescape)) int *);
|
|
|
|
void test5(BlockTy2 b, int *p) {
|
|
^(int *__attribute__((noescape)) p0){}(p);
|
|
b(p);
|
|
}
|