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: @_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