blob: 20cc7b485441acba1ca09ba94a2559039e3e39a7 [file] [log] [blame]
John McCall5fb5df92012-06-20 06:18:46 +00001// RUN: %clang_cc1 -emit-llvm -fblocks -o - -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 %s | FileCheck %s
Douglas Gregoraab11ed2010-05-25 17:46:21 +00002
Eli Friedmand0ee1292013-06-24 20:24:19 +00003// CHECK: @_ZGVN23__block_prefix_internal5valueE = internal global i64 0
4// CHECK: @_ZN24__block_prefix_internal35namebE = internal global i8*
Douglas Gregoraab11ed2010-05-25 17:46:21 +00005
6int f();
7
8void foo() {
Fariborz Jahanian63628032012-06-26 16:06:38 +00009 // CHECK: define internal i32 @___Z3foov_block_invoke
Eli Friedmand0ee1292013-06-24 20:24:19 +000010 // CHECK: call i32 @__cxa_guard_acquire(i64* @_ZGVN23__block_prefix_internal5valueE
Douglas Gregoraab11ed2010-05-25 17:46:21 +000011 (void)^(int x) {
12 static int value = f();
13 return x + value;
14 };
15}
16
Fariborz Jahanian63628032012-06-26 16:06:38 +000017// CHECK: define internal i32 @i_block_invoke
Douglas Gregoraab11ed2010-05-25 17:46:21 +000018int i = ^(int x) { return x;}(i);
19
20@interface A
21- (void)method;
22@end
23
24@implementation A
25- (void)method {
Fariborz Jahanian63628032012-06-26 16:06:38 +000026 // CHECK: define internal signext i8 @"__11-[A method]_block_invoke"
Douglas Gregoraab11ed2010-05-25 17:46:21 +000027 (void)^(int x) {
Eli Friedmand0ee1292013-06-24 20:24:19 +000028 // CHECK: @_ZN24__block_prefix_internal04nameE
Douglas Gregoraab11ed2010-05-25 17:46:21 +000029 static const char *name = "hello";
30 return name[x];
31 };
32}
33@end
34
35void foo(int) {
36 (void)^(int x) {
37 static const char *name = "hello";
38 return name[x];
39 };
40}
41
42namespace N {
Fariborz Jahanian63628032012-06-26 16:06:38 +000043 // CHECK: define internal signext i8 @___Z3fooi_block_invoke
Douglas Gregoraab11ed2010-05-25 17:46:21 +000044 void bar() {
45 (void)^(int x) {
Eli Friedmand0ee1292013-06-24 20:24:19 +000046 // CHECK: @_ZN24__block_prefix_internal14nameE
Douglas Gregoraab11ed2010-05-25 17:46:21 +000047 static const char *name = "hello";
48 return name[x];
49 };
50 }
51}
Eli Friedmand0ee1292013-06-24 20:24:19 +000052
53class C {
54 C();
55};
56C::C() {
57 (void)^(int x) {
58 // CHECK: @_ZN24__block_prefix_internal35namebE
59 static const char *nameb = "hello";
60 return nameb[x];
61 };
62}