18c1441f8SAlexey Samsonov //
2*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
3*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
4*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
58c1441f8SAlexey Samsonov
68c1441f8SAlexey Samsonov #import <Block.h>
78c1441f8SAlexey Samsonov #import <stdio.h>
88c1441f8SAlexey Samsonov #import <stdlib.h>
98c1441f8SAlexey Samsonov
108c1441f8SAlexey Samsonov // CONFIG C++
118c1441f8SAlexey Samsonov
128c1441f8SAlexey Samsonov int recovered = 0;
138c1441f8SAlexey Samsonov
148c1441f8SAlexey Samsonov
158c1441f8SAlexey Samsonov
168c1441f8SAlexey Samsonov int constructors = 0;
178c1441f8SAlexey Samsonov int destructors = 0;
188c1441f8SAlexey Samsonov
198c1441f8SAlexey Samsonov #define CONST const
208c1441f8SAlexey Samsonov
218c1441f8SAlexey Samsonov class TestObject
228c1441f8SAlexey Samsonov {
238c1441f8SAlexey Samsonov public:
248c1441f8SAlexey Samsonov TestObject(CONST TestObject& inObj);
258c1441f8SAlexey Samsonov TestObject();
268c1441f8SAlexey Samsonov ~TestObject();
278c1441f8SAlexey Samsonov
288c1441f8SAlexey Samsonov TestObject& operator=(CONST TestObject& inObj);
298c1441f8SAlexey Samsonov
308c1441f8SAlexey Samsonov void test(void);
318c1441f8SAlexey Samsonov
version()328c1441f8SAlexey Samsonov int version() CONST { return _version; }
338c1441f8SAlexey Samsonov private:
348c1441f8SAlexey Samsonov mutable int _version;
358c1441f8SAlexey Samsonov };
368c1441f8SAlexey Samsonov
TestObject(CONST TestObject & inObj)378c1441f8SAlexey Samsonov TestObject::TestObject(CONST TestObject& inObj)
388c1441f8SAlexey Samsonov
398c1441f8SAlexey Samsonov {
408c1441f8SAlexey Samsonov ++constructors;
418c1441f8SAlexey Samsonov _version = inObj._version;
428c1441f8SAlexey Samsonov //printf("%p (%d) -- TestObject(const TestObject&) called", this, _version);
438c1441f8SAlexey Samsonov }
448c1441f8SAlexey Samsonov
458c1441f8SAlexey Samsonov
TestObject()468c1441f8SAlexey Samsonov TestObject::TestObject()
478c1441f8SAlexey Samsonov {
488c1441f8SAlexey Samsonov _version = ++constructors;
498c1441f8SAlexey Samsonov //printf("%p (%d) -- TestObject() called\n", this, _version);
508c1441f8SAlexey Samsonov }
518c1441f8SAlexey Samsonov
528c1441f8SAlexey Samsonov
~TestObject()538c1441f8SAlexey Samsonov TestObject::~TestObject()
548c1441f8SAlexey Samsonov {
558c1441f8SAlexey Samsonov //printf("%p -- ~TestObject() called\n", this);
568c1441f8SAlexey Samsonov ++destructors;
578c1441f8SAlexey Samsonov }
588c1441f8SAlexey Samsonov
598c1441f8SAlexey Samsonov #if 1
608c1441f8SAlexey Samsonov TestObject& TestObject::operator=(CONST TestObject& inObj)
618c1441f8SAlexey Samsonov {
628c1441f8SAlexey Samsonov //printf("%p -- operator= called", this);
638c1441f8SAlexey Samsonov _version = inObj._version;
648c1441f8SAlexey Samsonov return *this;
658c1441f8SAlexey Samsonov }
668c1441f8SAlexey Samsonov #endif
678c1441f8SAlexey Samsonov
test(void)688c1441f8SAlexey Samsonov void TestObject::test(void) {
698c1441f8SAlexey Samsonov void (^b)(void) = ^{ recovered = _version; };
708c1441f8SAlexey Samsonov void (^b2)(void) = Block_copy(b);
718c1441f8SAlexey Samsonov b2();
728c1441f8SAlexey Samsonov Block_release(b2);
738c1441f8SAlexey Samsonov }
748c1441f8SAlexey Samsonov
758c1441f8SAlexey Samsonov
768c1441f8SAlexey Samsonov
testRoutine()778c1441f8SAlexey Samsonov void testRoutine() {
788c1441f8SAlexey Samsonov TestObject one;
798c1441f8SAlexey Samsonov
808c1441f8SAlexey Samsonov
818c1441f8SAlexey Samsonov one.test();
828c1441f8SAlexey Samsonov }
838c1441f8SAlexey Samsonov
848c1441f8SAlexey Samsonov
858c1441f8SAlexey Samsonov
main(int argc,char * argv[])868c1441f8SAlexey Samsonov int main(int argc, char *argv[]) {
878c1441f8SAlexey Samsonov testRoutine();
888c1441f8SAlexey Samsonov if (recovered == 1) {
898c1441f8SAlexey Samsonov printf("%s: success\n", argv[0]);
908c1441f8SAlexey Samsonov exit(0);
918c1441f8SAlexey Samsonov }
928c1441f8SAlexey Samsonov printf("%s: *** didn't recover byref block variable\n", argv[0]);
938c1441f8SAlexey Samsonov exit(1);
948c1441f8SAlexey Samsonov }
95