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: @_ZGVZZ3foovEUb_E5value = internal global i64 0 4 // CHECK: @_ZZZN26externally_visible_statics1S3fooEiEd_Ub_E1k = linkonce_odr global i32 0 5 // CHECK: @_ZZ26externally_visible_statics1S1xMUb_E1j = linkonce_odr global i32 0 6 // CHECK: @_ZZZN26externally_visible_statics10inlinefuncEvEUb_E1i = linkonce_odr global i32 0 7 8 int f(); 9 10 void 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 20 int 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]EUb0_E4name" 31 static const char *name = "hello"; 32 return name[x]; 33 }; 34 } 35 @end 36 37 void foo(int) { 38 (void)^(int x) { 39 static const char *name = "hello"; 40 return name[x]; 41 }; 42 } 43 44 namespace N { 45 // CHECK-LABEL: define internal signext i8 @___Z3fooi_block_invoke 46 void bar() { 47 (void)^(int x) { 48 // CHECK: @_ZZZN1N3barEvEUb2_E4name 49 static const char *name = "hello"; 50 return name[x]; 51 }; 52 } 53 } 54 55 class C { 56 C(); 57 }; 58 C::C() { 59 (void)^(int x) { 60 // CHECK: @_ZZZN1CC1EvEUb3_E5nameb 61 static const char *nameb = "hello"; 62 return nameb[x]; 63 }; 64 } 65 66 int f(); 67 namespace externally_visible_statics { 68 inline void inlinefunc() { 69 ^{ 70 static int i = f(); 71 }(); 72 } 73 struct S { 74 int x = ^{ 75 static int j = f(); 76 return j; 77 }(); 78 void foo(int y = ^{ static int k = f(); return k; }()) {} 79 }; 80 void g() { 81 inlinefunc(); 82 S s; 83 s.foo(); 84 } 85 } 86