186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// 286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// The LLVM Compiler Infrastructure 386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// 486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// This file is distributed under the University of Illinois Open Source 586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// License. See LICENSE.TXT for details. 686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// CONFIG rdar://6255170 886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <stdio.h> 1086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <stdbool.h> 1186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <stdlib.h> 1286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <Block.h> 1386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <Block_private.h> 1486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <assert.h> 1586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 1786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint 1886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstmain(int argc, char *argv[]) 1986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{ 2086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst __block int var = 0; 2186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst int shouldbe = 0; 2286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst void (^b)(void) = ^{ var++; /*printf("var is at %p with value %d\n", &var, var);*/ }; 2386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst __typeof(b) _b; 2486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("before copy...\n"); 2586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst b(); ++shouldbe; 2686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst size_t i; 2786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 2886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst for (i = 0; i < 10; i++) { 2986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst _b = Block_copy(b); // make a new copy each time 3086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst assert(_b); 3186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst ++shouldbe; 3286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst _b(); // should still update the stack 3386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst Block_release(_b); 3486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst } 3586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 3686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst //printf("after...\n"); 3786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst b(); ++shouldbe; 3886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 3986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst if (var != shouldbe) { 4086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("Hmm, var is %d but should be %d\n", var, shouldbe); 4186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return 1; 4286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst } 4386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst printf("%s: Success!!\n", argv[0]); 4486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst 4586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst return 0; 4686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst} 47