|  | // RUN: %clang_cc1 -triple thumbv7-apple-ios %s -emit-llvm -o %t -fblocks | 
|  | // RUN: grep "_Block_object_dispose" %t | count 12 | 
|  | // RUN: grep "__copy_helper_block_" %t | count 9 | 
|  | // RUN: grep "__destroy_helper_block_" %t | count 9 | 
|  | // RUN: grep "__Block_byref_object_copy_" %t | count 2 | 
|  | // RUN: grep "__Block_byref_object_dispose_" %t | count 2 | 
|  | // RUN: grep "i32 135)" %t | count 2 | 
|  | // RUN: grep "_Block_object_assign" %t | count 5 | 
|  |  | 
|  | // RUN: %clang_cc1 -triple thumbv7-unknown-windows %s -emit-llvm -o %t -fblocks | 
|  | // RUN: grep "_Block_object_dispose" %t | count 12 | 
|  | // RUN: grep "__copy_helper_block_" %t | count 11 | 
|  | // RUN: grep "__destroy_helper_block_" %t | count 11 | 
|  | // RUN: grep "__Block_byref_object_copy_" %t | count 2 | 
|  | // RUN: grep "__Block_byref_object_dispose_" %t | count 2 | 
|  | // RUN: grep "i32 135)" %t | count 2 | 
|  | // RUN: grep "_Block_object_assign" %t | count 5 | 
|  |  | 
|  | int printf(const char *, ...); | 
|  |  | 
|  | void test1(void) { | 
|  | __block int a; | 
|  | int b=2; | 
|  | a=1; | 
|  | printf("a is %d, b is %d\n", a, b); | 
|  | ^{ a = 10; printf("a is %d, b is %d\n", a, b); }(); // needs copy/dispose | 
|  | printf("a is %d, b is %d\n", a, b); | 
|  | a = 1; | 
|  | printf("a is %d, b is %d\n", a, b); | 
|  | } | 
|  |  | 
|  | void test2(void) { | 
|  | __block int a; | 
|  | a=1; | 
|  | printf("a is %d\n", a); | 
|  | ^{ // needs copy/dispose | 
|  | ^{ // needs copy/dispose | 
|  | a = 10; | 
|  | }(); | 
|  | }(); | 
|  | printf("a is %d\n", a); | 
|  | a = 1; | 
|  | printf("a is %d\n", a); | 
|  | } | 
|  |  | 
|  | void test3(void) { | 
|  | __block int k; | 
|  | __block int (^j)(int); | 
|  | ^{j=0; k=0;}(); // needs copy/dispose | 
|  | } | 
|  |  | 
|  | int test4(void) { | 
|  | extern int g; | 
|  | static int i = 1; | 
|  | ^(int j){ i = j; g = 0; }(0); // does not need copy/dispose | 
|  | return i + g; | 
|  | } | 
|  |  | 
|  | int g; | 
|  |  | 
|  | void test5(void) { | 
|  | __block struct { int i; } i; | 
|  | ^{ (void)i; }(); // needs copy/dispose | 
|  | } | 
|  |  | 
|  | void test6(void) { | 
|  | __block int i; | 
|  | ^{ i=1; }(); // needs copy/dispose | 
|  | ^{}(); // does not need copy/dispose | 
|  | } | 
|  |  | 
|  | void test7(void) { | 
|  | ^{ // does not need copy/dispose | 
|  | __block int i; | 
|  | ^{ i = 1; }(); // needs copy/dispose | 
|  | }(); | 
|  | } | 
|  |  | 
|  | int main(void) { | 
|  | int rv = 0; | 
|  | test1(); | 
|  | test2(); | 
|  | test3(); | 
|  | rv += test4(); | 
|  | test5(); | 
|  | return rv; | 
|  | } |