|  | // RUN: %clang_cc1 -emit-llvm -fblocks -o - -triple x86_64-apple-darwin10 -fobjc-runtime=macosx-fragile-10.5 %s | FileCheck %s | 
|  |  | 
|  | // CHECK: @_ZZZN26externally_visible_statics1S3fooEiEd_Ub0_E1k = linkonce_odr global i32 0 | 
|  | // CHECK: @_ZZZN26externally_visible_statics10inlinefuncEvEUb0_E1i = linkonce_odr global i32 0 | 
|  | // CHECK: @_ZZ26externally_visible_statics1S1xMUb0_E1j = linkonce_odr global i32 0 | 
|  |  | 
|  | int f(); | 
|  |  | 
|  | void foo() { | 
|  | // CHECK-LABEL: define internal i32 @___Z3foov_block_invoke | 
|  | // CHECK: call i32 @__cxa_guard_acquire(i64* @_ZGVZZ3foovEUb_E5value | 
|  | (void)^(int x) { | 
|  | static int value = f(); | 
|  | return x + value; | 
|  | }; | 
|  | } | 
|  |  | 
|  | // CHECK-LABEL: define internal i32 @i_block_invoke | 
|  | int i = ^(int x) { return x;}(i); | 
|  |  | 
|  | @interface A | 
|  | - (void)method; | 
|  | @end | 
|  |  | 
|  | @implementation A | 
|  | - (void)method { | 
|  | // CHECK: define internal signext i8 @"__11-[A method]_block_invoke" | 
|  | (void)^(int x) { | 
|  | // CHECK: @"_ZZZ11-[A method]EUb1_E4name" | 
|  | static const char *name = "hello"; | 
|  | return name[x]; | 
|  | }; | 
|  | } | 
|  | @end | 
|  |  | 
|  | void foo(int) { | 
|  | (void)^(int x) { | 
|  | static const char *name = "hello"; | 
|  | return name[x]; | 
|  | }; | 
|  | } | 
|  |  | 
|  | namespace N { | 
|  | // CHECK-LABEL: define internal signext i8 @___Z3fooi_block_invoke | 
|  | void bar() { | 
|  | (void)^(int x) { | 
|  | // CHECK: @_ZZZN1N3barEvEUb3_E4name | 
|  | static const char *name = "hello"; | 
|  | return name[x]; | 
|  | }; | 
|  | } | 
|  | } | 
|  |  | 
|  | class C { | 
|  | C(); | 
|  | }; | 
|  | C::C() { | 
|  | (void)^(int x) { | 
|  | // CHECK: @_ZZZN1CC1EvEUb4_E5nameb | 
|  | static const char *nameb = "hello"; | 
|  | return nameb[x]; | 
|  | }; | 
|  | } | 
|  |  | 
|  | int f(); | 
|  | namespace externally_visible_statics { | 
|  | inline void inlinefunc() { | 
|  | ^{ | 
|  | static int i = f(); | 
|  | }(); | 
|  | } | 
|  | struct S { | 
|  | int x = ^{ | 
|  | static int j = f(); | 
|  | return j; | 
|  | }(); | 
|  | void foo(int y = ^{ static int k = f(); return k; }()) {} | 
|  | }; | 
|  | void g() { | 
|  | inlinefunc(); | 
|  | S s; | 
|  | s.foo(); | 
|  | } | 
|  | } |