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