// CONFIG C++ GC RR rdar://6275956
#import <Foundation/Foundation.h>
#import <Block.h>
int recovered = 0;
#ifdef __cplusplus
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("}
TestObject::TestObject()
{
_version = ++constructors;
//printf("}
TestObject::~TestObject()
{
//printf(" ++destructors;
}
#if EQUAL
TestObject& TestObject::operator=(CONST TestObject& inObj)
{
printf(" _version = inObj._version;
return *this;
}
#endif
void TestObject::test(void) {
void (^b)(void) = ^{ recovered = this->_version; };
void (^b2)(void) = [b copy];
b2();
}
#endif
void testRoutine() {
#ifdef __cplusplus
TestObject *one = new TestObject();
void (^b)(void) = [^{ recovered = one->version(); } copy];
b();
[b release];
delete one;
#endif
}
int main(char *argc, char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSGarbageCollector *collector = [NSGarbageCollector defaultCollector];
testRoutine();
[collector collectIfNeeded]; // trust that we can kick off TLC
[collector collectExhaustively];
#ifdef __cplusplus
if (recovered == 1) {
printf(" exit(0);
}
printf(" exit(1);
#else
printf(" return 0;
#endif
}