186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//
286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//                     The LLVM Compiler Infrastructure
386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst//
486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// This file is distributed under the University of Illinois Open Source
586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// License. See LICENSE.TXT for details.
686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <stdio.h>
886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#include <Block.h>
986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst// CONFIG C++ rdar://6243400,rdar://6289367
1186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint constructors = 0;
1486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint destructors = 0;
1586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst#define CONST const
1886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
1986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstclass TestObject
2086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{
2186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstpublic:
2286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	TestObject(CONST TestObject& inObj);
2386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	TestObject();
2486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	~TestObject();
2586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
2686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	TestObject& operator=(CONST TestObject& inObj);
2786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
2886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	int version() CONST { return _version; }
2986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstprivate:
3086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	mutable int _version;
3186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst};
3286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject::TestObject(CONST TestObject& inObj)
3486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
3586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{
3686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        ++constructors;
3786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        _version = inObj._version;
3886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	//printf("%p (%d) -- TestObject(const TestObject&) called\n", this, _version);
3986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
4086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject::TestObject()
4386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{
4486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        _version = ++constructors;
4586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	//printf("%p (%d) -- TestObject() called\n", this, _version);
4686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
4786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
4986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject::~TestObject()
5086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{
5186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	//printf("%p -- ~TestObject() called\n", this);
5286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        ++destructors;
5386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
5486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
5586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
5686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine GarstTestObject& TestObject::operator=(CONST TestObject& inObj)
5786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst{
5886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	//printf("%p -- operator= called\n", this);
5986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        _version = inObj._version;
6086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst	return *this;
6186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
6286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
6386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
6486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
6586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstvoid testRoutine() {
6686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    TestObject one;
6786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
6886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    void (^b)(void) = ^{ printf("my const copy of one is %d\n", one.version()); };
6986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
7086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
7186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
7286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst
7386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garstint main(int argc, char *argv[]) {
7486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    testRoutine();
7586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    if (constructors == 0) {
7686d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        printf("No copy constructors!!!\n");
7786d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        return 1;
7886d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    }
7986d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    if (constructors != destructors) {
8086d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        printf("%d constructors but only %d destructors\n", constructors, destructors);
8186d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst        return 1;
8286d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    }
8386d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    printf("%s:success\n", argv[0]);
8486d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst    return 0;
8586d0ba4286ec42dcd055bd22434c7f40009834bdBlaine Garst}
86