xref: /llvm-project/compiler-rt/test/BlocksRuntime/reference.C (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
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