95 lines · c
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-exception5 6#import <Block.h>7#import <stdio.h>8#import <stdlib.h>9 10// CONFIG C++11 12int recovered = 0;13 14 15 16int constructors = 0;17int destructors = 0;18 19#define CONST const20 21class TestObject22{23public:24 TestObject(CONST TestObject& inObj);25 TestObject();26 ~TestObject();27 28 TestObject& operator=(CONST TestObject& inObj);29 30 void test(void);31 32 int version() CONST { return _version; }33private:34 mutable int _version;35};36 37TestObject::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 46TestObject::TestObject()47{48 _version = ++constructors;49 //printf("%p (%d) -- TestObject() called\n", this, _version); 50}51 52 53TestObject::~TestObject()54{55 //printf("%p -- ~TestObject() called\n", this);56 ++destructors;57}58 59#if 160TestObject& TestObject::operator=(CONST TestObject& inObj)61{62 //printf("%p -- operator= called", this);63 _version = inObj._version;64 return *this;65}66#endif67 68void 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 77void testRoutine() {78 TestObject one;79 80 81 one.test();82}83 84 85 86int 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