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