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
version()33 int version() CONST { return _version; }
34 private:
35 mutable int _version;
36 };
37
TestObject(CONST TestObject & inObj)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
TestObject()47 TestObject::TestObject()
48 {
49 _version = ++constructors;
50 //printf("%p (%d) -- TestObject() called\n", this, _version);
51 }
52
53
~TestObject()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
test(void)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
testRoutine()78 void testRoutine() {
79 TestObject one;
80
81
82 one.test();
83 }
84
85
86
main(int argc,char * argv[])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