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