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#import <Block.h>
886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#import <stdio.h>
986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#import <stdlib.h>
1086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// CONFIG C++
1286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint recovered = 0;
1486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint constructors = 0;
1886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint destructors = 0;
1986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
2086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#define CONST const
2186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
2286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstclass TestObject
2386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{
2486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstpublic:
2586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	TestObject(CONST TestObject& inObj);
2686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	TestObject();
2786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	~TestObject();
2886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
2986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	TestObject& operator=(CONST TestObject& inObj);
3086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        void test(void);
3286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	int version() CONST { return _version; }
3486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstprivate:
3586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	mutable int _version;
3686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst};
3786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject::TestObject(CONST TestObject& inObj)
3986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{
4186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        ++constructors;
4286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        _version = inObj._version;
4386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	//printf("%p (%d) -- TestObject(const TestObject&) called", this, _version);
4486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
4586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject::TestObject()
4886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{
4986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        _version = ++constructors;
5086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	//printf("%p (%d) -- TestObject() called\n", this, _version);
5186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
5286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
5386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
5486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject::~TestObject()
5586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{
5686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	//printf("%p -- ~TestObject() called\n", this);
5786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        ++destructors;
5886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
5986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
6086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#if 1
6186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject& TestObject::operator=(CONST TestObject& inObj)
6286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{
6386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	//printf("%p -- operator= called", this);
6486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        _version = inObj._version;
6586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	return *this;
6686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
6786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#endif
6886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
6986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstvoid TestObject::test(void)  {
7086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    void (^b)(void) = ^{ recovered = _version; };
7186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    void (^b2)(void) = Block_copy(b);
7286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    b2();
7386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    Block_release(b2);
7486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
7586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
7686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
7786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
7886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstvoid testRoutine() {
7986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    TestObject one;
8086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
8186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
8286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    one.test();
8386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
8486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
8586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
8686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
8786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint main(int argc, char *argv[]) {
8886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    testRoutine();
8986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    if (recovered == 1) {
9086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        printf("%s: success\n", argv[0]);
9186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        exit(0);
9286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    }
9386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    printf("%s: *** didn't recover byref block variable\n", argv[0]);
9486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    exit(1);
9586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
96