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