derived-to-base-conv.cpp revision 2f59979a7cc7929f53c9984423b0abeb83113442
1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s 24fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s 3a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s 44fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s 593034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian 693034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianextern "C" int printf(...); 73759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianextern "C" void exit(int); 893034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian 993034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianstruct A { 102f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor A (const A&) { printf("A::A(const A&)\n"); } 112f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor A() {}; 122f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor ~A() { printf("A::~A()\n"); } 1393034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian}; 1493034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian 1593034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianstruct B : public A { 1693034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian B() {}; 172f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor B(const B& Other) : A(Other) { printf("B::B(const B&)\n"); } 182f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor ~B() { printf("B::~B()\n"); } 192f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor}; 2093034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian 2193034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianstruct C : public B { 2293034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian C() {}; 232f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor C(const C& Other) : B(Other) { printf("C::C(const C&)\n"); } 242f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor ~C() { printf("C::~C()\n"); } 2593034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian}; 2693034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian 2793034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianstruct X { 2893034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian operator B&() {printf("X::operator B&()\n"); return b; } 2993034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian operator C&() {printf("X::operator C&()\n"); return c; } 3093034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian X (const X&) { printf("X::X(const X&)\n"); } 3193034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian X () { printf("X::X()\n"); } 322f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor ~X () { printf("X::~X()\n"); } 3393034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian B b; 3493034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian C c; 3593034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian}; 3693034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian 3793034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianvoid f(A) { 3893034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian printf("f(A)\n"); 3993034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian} 4093034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian 4193034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian 4293034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianvoid func(X x) 4393034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian{ 4493034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian f (x); 4593034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian} 4693034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian 4793034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianint main() 4893034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian{ 4993034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian X x; 5093034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian func(x); 5193034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian} 5293034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian 533759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianstruct Base; 543759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian 553759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianstruct Root { 563759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian operator Base&() { exit(1); } 573759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian}; 583759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian 593759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianstruct Derived; 603759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian 613759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianstruct Base : Root { 623759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian Base(const Base&) { printf("Base::(const Base&)\n"); } 633759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian Base() { printf("Base::Base()\n"); } 643759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian operator Derived&() { exit(1); } 653759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian}; 663759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian 673759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianstruct Derived : Base { 683759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian}; 693759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian 703759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianvoid foo(Base) {} 713759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian 723759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianvoid test(Derived bb) 733759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian{ 743b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan // CHECK-LP64-NOT: callq __ZN4BasecvR7DerivedEv 753b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan // CHECK-LP32-NOT: callq L__ZN4BasecvR7DerivedEv 763759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian foo(bb); 773759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian} 783b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __ZN1XcvR1BEv 793b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __ZN1AC1ERKS_ 8093034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian 8193034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian// CHECK-LP32: call L__ZN1XcvR1BEv 8293034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian// CHECK-LP32: call L__ZN1AC1ERKS_ 833759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian 843759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian 85