xref: /llvm-project/compiler-rt/test/BlocksRuntime/copyconstructor.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 #include <stdio.h>
78c1441f8SAlexey Samsonov #include <Block.h>
88c1441f8SAlexey Samsonov 
98c1441f8SAlexey Samsonov // CONFIG C++ rdar://6243400,rdar://6289367
108c1441f8SAlexey Samsonov 
118c1441f8SAlexey Samsonov 
128c1441f8SAlexey Samsonov int constructors = 0;
138c1441f8SAlexey Samsonov int destructors = 0;
148c1441f8SAlexey Samsonov 
158c1441f8SAlexey Samsonov 
168c1441f8SAlexey Samsonov #define CONST const
178c1441f8SAlexey Samsonov 
188c1441f8SAlexey Samsonov class TestObject
198c1441f8SAlexey Samsonov {
208c1441f8SAlexey Samsonov public:
218c1441f8SAlexey Samsonov 	TestObject(CONST TestObject& inObj);
228c1441f8SAlexey Samsonov 	TestObject();
238c1441f8SAlexey Samsonov 	~TestObject();
248c1441f8SAlexey Samsonov 
258c1441f8SAlexey Samsonov 	TestObject& operator=(CONST TestObject& inObj);
268c1441f8SAlexey Samsonov 
version()278c1441f8SAlexey Samsonov 	int version() CONST { return _version; }
288c1441f8SAlexey Samsonov private:
298c1441f8SAlexey Samsonov 	mutable int _version;
308c1441f8SAlexey Samsonov };
318c1441f8SAlexey Samsonov 
TestObject(CONST TestObject & inObj)328c1441f8SAlexey Samsonov TestObject::TestObject(CONST TestObject& inObj)
338c1441f8SAlexey Samsonov 
348c1441f8SAlexey Samsonov {
358c1441f8SAlexey Samsonov         ++constructors;
368c1441f8SAlexey Samsonov         _version = inObj._version;
378c1441f8SAlexey Samsonov 	//printf("%p (%d) -- TestObject(const TestObject&) called\n", this, _version);
388c1441f8SAlexey Samsonov }
398c1441f8SAlexey Samsonov 
408c1441f8SAlexey Samsonov 
TestObject()418c1441f8SAlexey Samsonov TestObject::TestObject()
428c1441f8SAlexey Samsonov {
438c1441f8SAlexey Samsonov         _version = ++constructors;
448c1441f8SAlexey Samsonov 	//printf("%p (%d) -- TestObject() called\n", this, _version);
458c1441f8SAlexey Samsonov }
468c1441f8SAlexey Samsonov 
478c1441f8SAlexey Samsonov 
~TestObject()488c1441f8SAlexey Samsonov TestObject::~TestObject()
498c1441f8SAlexey Samsonov {
508c1441f8SAlexey Samsonov 	//printf("%p -- ~TestObject() called\n", this);
518c1441f8SAlexey Samsonov         ++destructors;
528c1441f8SAlexey Samsonov }
538c1441f8SAlexey Samsonov 
548c1441f8SAlexey Samsonov 
558c1441f8SAlexey Samsonov TestObject& TestObject::operator=(CONST TestObject& inObj)
568c1441f8SAlexey Samsonov {
578c1441f8SAlexey Samsonov 	//printf("%p -- operator= called\n", this);
588c1441f8SAlexey Samsonov         _version = inObj._version;
598c1441f8SAlexey Samsonov 	return *this;
608c1441f8SAlexey Samsonov }
618c1441f8SAlexey Samsonov 
628c1441f8SAlexey Samsonov 
638c1441f8SAlexey Samsonov 
testRoutine()648c1441f8SAlexey Samsonov void testRoutine() {
658c1441f8SAlexey Samsonov     TestObject one;
668c1441f8SAlexey Samsonov 
678c1441f8SAlexey Samsonov     void (^b)(void) = ^{ printf("my const copy of one is %d\n", one.version()); };
688c1441f8SAlexey Samsonov }
698c1441f8SAlexey Samsonov 
708c1441f8SAlexey Samsonov 
718c1441f8SAlexey Samsonov 
main(int argc,char * argv[])728c1441f8SAlexey Samsonov int main(int argc, char *argv[]) {
738c1441f8SAlexey Samsonov     testRoutine();
748c1441f8SAlexey Samsonov     if (constructors == 0) {
758c1441f8SAlexey Samsonov         printf("No copy constructors!!!\n");
768c1441f8SAlexey Samsonov         return 1;
778c1441f8SAlexey Samsonov     }
788c1441f8SAlexey Samsonov     if (constructors != destructors) {
798c1441f8SAlexey Samsonov         printf("%d constructors but only %d destructors\n", constructors, destructors);
808c1441f8SAlexey Samsonov         return 1;
818c1441f8SAlexey Samsonov     }
828c1441f8SAlexey Samsonov     printf("%s:success\n", argv[0]);
838c1441f8SAlexey Samsonov     return 0;
848c1441f8SAlexey Samsonov }
85