|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  |  | 
|  | #import <Block.h> | 
|  | #import <stdio.h> | 
|  | #import <stdlib.h> | 
|  |  | 
|  | // CONFIG C++ | 
|  |  | 
|  | int recovered = 0; | 
|  |  | 
|  |  | 
|  |  | 
|  | int constructors = 0; | 
|  | int destructors = 0; | 
|  |  | 
|  | #define CONST const | 
|  |  | 
|  | class TestObject | 
|  | { | 
|  | public: | 
|  | TestObject(CONST TestObject& inObj); | 
|  | TestObject(); | 
|  | ~TestObject(); | 
|  |  | 
|  | TestObject& operator=(CONST TestObject& inObj); | 
|  |  | 
|  | 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 1 | 
|  | 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 = _version; }; | 
|  | void (^b2)(void) = Block_copy(b); | 
|  | b2(); | 
|  | Block_release(b2); | 
|  | } | 
|  |  | 
|  |  | 
|  |  | 
|  | void testRoutine() { | 
|  | TestObject one; | 
|  |  | 
|  |  | 
|  | one.test(); | 
|  | } | 
|  |  | 
|  |  | 
|  |  | 
|  | int main(int argc, char *argv[]) { | 
|  | testRoutine(); | 
|  | if (recovered == 1) { | 
|  | printf("%s: success\n", argv[0]); | 
|  | exit(0); | 
|  | } | 
|  | printf("%s: *** didn't recover byref block variable\n", argv[0]); | 
|  | exit(1); | 
|  | } |