|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  |  | 
|  | /* | 
|  | *  recursiveassign.c | 
|  | *  testObjects | 
|  | * | 
|  | *  Created by Blaine Garst on 12/3/08. | 
|  | * | 
|  | */ | 
|  |  | 
|  | // CONFIG  rdar://6639533 | 
|  |  | 
|  | // The compiler is prefetching x->forwarding before evaluting code that recomputes forwarding and so the value goes to a place that is never seen again. | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <Block.h> | 
|  |  | 
|  |  | 
|  | int main(int argc, char* argv[]) { | 
|  |  | 
|  | __block void (^recursive_copy_block)(int) = ^(int arg) { printf("got wrong Block\n"); exit(1); }; | 
|  |  | 
|  |  | 
|  | recursive_copy_block = Block_copy(^(int i) { | 
|  | if (i > 0) { | 
|  | recursive_copy_block(i - 1); | 
|  | } | 
|  | else { | 
|  | printf("done!\n"); | 
|  | } | 
|  | }); | 
|  |  | 
|  |  | 
|  | recursive_copy_block(5); | 
|  |  | 
|  | printf("%s: Success\n", argv[0]); | 
|  | return 0; | 
|  | } | 
|  |  |