|  | // RUN: %clang_cc1 %s -emit-llvm -o %t -fblocks | 
|  | // RUN: grep "_Block_object_dispose" %t | count 17 | 
|  | // RUN: grep "__copy_helper_block_" %t | count 14 | 
|  | // RUN: grep "__destroy_helper_block_" %t | count 14 | 
|  | // 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 10 | 
|  |  | 
|  | int printf(const char *, ...); | 
|  |  | 
|  | void test1() { | 
|  | __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() { | 
|  | __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() { | 
|  | __block int k; | 
|  | __block int (^j)(int); | 
|  | ^{j=0; k=0;}(); // needs copy/dispose | 
|  | } | 
|  |  | 
|  | int test4() { | 
|  | 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() { | 
|  | __block struct { int i; } i; | 
|  | ^{ (void)i; }(); // needs copy/dispose | 
|  | } | 
|  |  | 
|  | void test6() { | 
|  | __block int i; | 
|  | ^{ i=1; }(); // needs copy/dispose | 
|  | ^{}(); // does not need copy/dispose | 
|  | } | 
|  |  | 
|  | void test7() { | 
|  | ^{ // does not need copy/dispose | 
|  | __block int i; | 
|  | ^{ i = 1; }(); // needs copy/dispose | 
|  | }(); | 
|  | } | 
|  |  | 
|  | int main() { | 
|  | int rv = 0; | 
|  | test1(); | 
|  | test2(); | 
|  | test3(); | 
|  | rv += test4(); | 
|  | test5(); | 
|  | return rv; | 
|  | } |