/*
 * Copyright (c) 2010 Apple Inc. All rights reserved.
 *
 * @APPLE_LLVM_LICENSE_HEADER@
 */

// TEST_CFLAGS -framework Foundation

// rdar://6275956

#import <objc/objc-auto.h>
#import <Foundation/Foundation.h>
#import <Block.h>
#import "test.h"

int recovered = 0;
int constructors = 0;
int destructors = 0;

#define CONST const

class TestObject
{
public:
	TestObject(CONST TestObject& inObj);
	TestObject();
	~TestObject();

#define EQUAL 1
#if EQUAL	
	TestObject& operator=(CONST TestObject& inObj);
#endif
        void test(void);

	int version() CONST { return _version; }
private:
	mutable int _version;
};

TestObject::TestObject(CONST TestObject& inObj)
	
{
        ++constructors;
        _version = inObj._version;
	printf("%p (%d) -- TestObject(const TestObject&) called", this, _version); 
}


TestObject::TestObject()
{
        _version = ++constructors;
	//printf("%p (%d) -- TestObject() called\n", this, _version); 
}


TestObject::~TestObject()
{
	//printf("%p -- ~TestObject() called\n", this);
        ++destructors;
}

#if EQUAL
TestObject& TestObject::operator=(CONST TestObject& inObj)
{
	printf("%p -- operator= called", this);
        _version = inObj._version;
	return *this;
}
#endif

void TestObject::test(void)  {
    void (^b)(void) = ^{ recovered = this->_version; };
    void (^b2)(void) = [b copy];
    b2();
}

void testRoutine() {
    TestObject *one = new TestObject();
    
    void (^b)(void) = [^{ recovered = one->version(); } copy];
    b();
    [b release];
    delete one;
}
    
    

int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    testRoutine();
    objc_collect(OBJC_EXHAUSTIVE_COLLECTION | OBJC_WAIT_UNTIL_DONE);
    [pool drain];

    if (recovered != 1) {
        fail("%s: *** didn't recover byref block variable");
    }

    succeed(__FILE__);
}
