1// RUN: %clang_cc1 -emit-llvm -fblocks -o - -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 %s | FileCheck %s 2 3// CHECK-DAG: @_ZZZN26externally_visible_statics1S3fooEiEd_Ub_E1k = linkonce_odr global i32 0 4// CHECK-DAG: @_ZZZN26externally_visible_statics10inlinefuncEvEUb_E1i = linkonce_odr global i32 0 5// CHECK-DAG: @_ZZZN26externally_visible_statics10inlinefuncEvEUb0_E1j = linkonce_odr global i32 0 6// CHECK-DAG: @_ZZ26externally_visible_statics1S1xMUb_E1j = linkonce_odr global i32 0 7 8int f(); 9 10void foo() { 11 // CHECK-LABEL: define internal i32 @___Z3foov_block_invoke 12 // CHECK: call i32 @__cxa_guard_acquire(i64* @_ZGVZZ3foovEUb_E5value 13 (void)^(int x) { 14 static int value = f(); 15 return x + value; 16 }; 17} 18 19// CHECK-LABEL: define internal i32 @i_block_invoke 20int i = ^(int x) { return x;}(i); 21 22@interface A 23- (void)method; 24@end 25 26@implementation A 27- (void)method { 28 // CHECK: define internal signext i8 @"__11-[A method]_block_invoke" 29 (void)^(int x) { 30 // CHECK: @"_ZZZ11-[A method]EUb1_E4name" 31 static const char *name = "hello"; 32 return name[x]; 33 }; 34} 35@end 36 37void foo(int) { 38 (void)^(int x) { 39 static const char *name = "hello"; 40 return name[x]; 41 }; 42} 43 44namespace N { 45 // CHECK-LABEL: define internal signext i8 @___Z3fooi_block_invoke 46 void bar() { 47 (void)^(int x) { 48 // CHECK: @_ZZZN1N3barEvEUb3_E4name 49 static const char *name = "hello"; 50 return name[x]; 51 }; 52 } 53} 54 55class C { 56 C(); 57}; 58C::C() { 59 (void)^(int x) { 60 // CHECK: @_ZZZN1CC1EvEUb4_E5nameb 61 static const char *nameb = "hello"; 62 return nameb[x]; 63 }; 64} 65 66int f(); 67namespace externally_visible_statics { 68 inline void inlinefunc() { 69 ^{ 70 static int i = f(); 71 }(); 72 ^{ 73 static int j = f(); 74 }(); 75 } 76 struct S { 77 int x = ^{ 78 static int j = f(); 79 return j; 80 }(); 81 void foo(int y = ^{ static int k = f(); return k; }()) {} 82 }; 83 void g() { 84 inlinefunc(); 85 S s; 86 s.foo(); 87 } 88} 89