95 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
| //
 | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | |
| // See https://llvm.org/LICENSE.txt for license information.
 | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | |
| 
 | |
| #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);
 | |
| }
 |