1*7c3d14c8STreehugger Robot //
2*7c3d14c8STreehugger Robot // The LLVM Compiler Infrastructure
3*7c3d14c8STreehugger Robot //
4*7c3d14c8STreehugger Robot // This file is distributed under the University of Illinois Open Source
5*7c3d14c8STreehugger Robot // License. See LICENSE.TXT for details.
6*7c3d14c8STreehugger Robot
7*7c3d14c8STreehugger Robot #include <stdio.h>
8*7c3d14c8STreehugger Robot #include <Block.h>
9*7c3d14c8STreehugger Robot
10*7c3d14c8STreehugger Robot // CONFIG C++ rdar://6243400,rdar://6289367
11*7c3d14c8STreehugger Robot
12*7c3d14c8STreehugger Robot
13*7c3d14c8STreehugger Robot int constructors = 0;
14*7c3d14c8STreehugger Robot int destructors = 0;
15*7c3d14c8STreehugger Robot
16*7c3d14c8STreehugger Robot
17*7c3d14c8STreehugger Robot #define CONST const
18*7c3d14c8STreehugger Robot
19*7c3d14c8STreehugger Robot class TestObject
20*7c3d14c8STreehugger Robot {
21*7c3d14c8STreehugger Robot public:
22*7c3d14c8STreehugger Robot TestObject(CONST TestObject& inObj);
23*7c3d14c8STreehugger Robot TestObject();
24*7c3d14c8STreehugger Robot ~TestObject();
25*7c3d14c8STreehugger Robot
26*7c3d14c8STreehugger Robot TestObject& operator=(CONST TestObject& inObj);
27*7c3d14c8STreehugger Robot
version()28*7c3d14c8STreehugger Robot int version() CONST { return _version; }
29*7c3d14c8STreehugger Robot private:
30*7c3d14c8STreehugger Robot mutable int _version;
31*7c3d14c8STreehugger Robot };
32*7c3d14c8STreehugger Robot
TestObject(CONST TestObject & inObj)33*7c3d14c8STreehugger Robot TestObject::TestObject(CONST TestObject& inObj)
34*7c3d14c8STreehugger Robot
35*7c3d14c8STreehugger Robot {
36*7c3d14c8STreehugger Robot ++constructors;
37*7c3d14c8STreehugger Robot _version = inObj._version;
38*7c3d14c8STreehugger Robot //printf("%p (%d) -- TestObject(const TestObject&) called\n", this, _version);
39*7c3d14c8STreehugger Robot }
40*7c3d14c8STreehugger Robot
41*7c3d14c8STreehugger Robot
TestObject()42*7c3d14c8STreehugger Robot TestObject::TestObject()
43*7c3d14c8STreehugger Robot {
44*7c3d14c8STreehugger Robot _version = ++constructors;
45*7c3d14c8STreehugger Robot //printf("%p (%d) -- TestObject() called\n", this, _version);
46*7c3d14c8STreehugger Robot }
47*7c3d14c8STreehugger Robot
48*7c3d14c8STreehugger Robot
~TestObject()49*7c3d14c8STreehugger Robot TestObject::~TestObject()
50*7c3d14c8STreehugger Robot {
51*7c3d14c8STreehugger Robot //printf("%p -- ~TestObject() called\n", this);
52*7c3d14c8STreehugger Robot ++destructors;
53*7c3d14c8STreehugger Robot }
54*7c3d14c8STreehugger Robot
55*7c3d14c8STreehugger Robot
56*7c3d14c8STreehugger Robot TestObject& TestObject::operator=(CONST TestObject& inObj)
57*7c3d14c8STreehugger Robot {
58*7c3d14c8STreehugger Robot //printf("%p -- operator= called\n", this);
59*7c3d14c8STreehugger Robot _version = inObj._version;
60*7c3d14c8STreehugger Robot return *this;
61*7c3d14c8STreehugger Robot }
62*7c3d14c8STreehugger Robot
63*7c3d14c8STreehugger Robot
64*7c3d14c8STreehugger Robot
testRoutine()65*7c3d14c8STreehugger Robot void testRoutine() {
66*7c3d14c8STreehugger Robot TestObject one;
67*7c3d14c8STreehugger Robot
68*7c3d14c8STreehugger Robot void (^b)(void) = ^{ printf("my const copy of one is %d\n", one.version()); };
69*7c3d14c8STreehugger Robot }
70*7c3d14c8STreehugger Robot
71*7c3d14c8STreehugger Robot
72*7c3d14c8STreehugger Robot
main(int argc,char * argv[])73*7c3d14c8STreehugger Robot int main(int argc, char *argv[]) {
74*7c3d14c8STreehugger Robot testRoutine();
75*7c3d14c8STreehugger Robot if (constructors == 0) {
76*7c3d14c8STreehugger Robot printf("No copy constructors!!!\n");
77*7c3d14c8STreehugger Robot return 1;
78*7c3d14c8STreehugger Robot }
79*7c3d14c8STreehugger Robot if (constructors != destructors) {
80*7c3d14c8STreehugger Robot printf("%d constructors but only %d destructors\n", constructors, destructors);
81*7c3d14c8STreehugger Robot return 1;
82*7c3d14c8STreehugger Robot }
83*7c3d14c8STreehugger Robot printf("%s:success\n", argv[0]);
84*7c3d14c8STreehugger Robot return 0;
85*7c3d14c8STreehugger Robot }
86