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