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