1 // 2 // The LLVM Compiler Infrastructure 3 // 4 // This file is distributed under the University of Illinois Open Source 5 // License. See LICENSE.TXT for details. 6 7 #import <Block.h> 8 #import <stdio.h> 9 #import <stdlib.h> 10 11 // CONFIG C++ 12 13 int recovered = 0; 14 15 16 17 int constructors = 0; 18 int destructors = 0; 19 20 #define CONST const 21 22 class TestObject 23 { 24 public: 25 TestObject(CONST TestObject& inObj); 26 TestObject(); 27 ~TestObject(); 28 29 TestObject& operator=(CONST TestObject& inObj); 30 31 void test(void); 32 33 int version() CONST { return _version; } 34 private: 35 mutable int _version; 36 }; 37 38 TestObject::TestObject(CONST TestObject& inObj) 39 40 { 41 ++constructors; 42 _version = inObj._version; 43 //printf("%p (%d) -- TestObject(const TestObject&) called", this, _version); 44 } 45 46 47 TestObject::TestObject() 48 { 49 _version = ++constructors; 50 //printf("%p (%d) -- TestObject() called\n", this, _version); 51 } 52 53 54 TestObject::~TestObject() 55 { 56 //printf("%p -- ~TestObject() called\n", this); 57 ++destructors; 58 } 59 60 #if 1 61 TestObject& TestObject::operator=(CONST TestObject& inObj) 62 { 63 //printf("%p -- operator= called", this); 64 _version = inObj._version; 65 return *this; 66 } 67 #endif 68 69 void TestObject::test(void) { 70 void (^b)(void) = ^{ recovered = _version; }; 71 void (^b2)(void) = Block_copy(b); 72 b2(); 73 Block_release(b2); 74 } 75 76 77 78 void testRoutine() { 79 TestObject one; 80 81 82 one.test(); 83 } 84 85 86 87 int main(int argc, char *argv[]) { 88 testRoutine(); 89 if (recovered == 1) { 90 printf("%s: success\n", argv[0]); 91 exit(0); 92 } 93 printf("%s: *** didn't recover byref block variable\n", argv[0]); 94 exit(1); 95 } 96