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