Home | History | Annotate | Download | only in CodeGenObjCXX
      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