derived-to-base-conv.cpp revision 398e6b90f5e161d520a95cbf34c732a55fd3e476
1// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s 2// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s 3// RUN: %clang_cc1 -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s 4// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s 5 6extern "C" int printf(...); 7extern "C" void exit(int); 8 9struct A { 10 A (const A&) { printf("A::A(const A&)\n"); } 11 A() {}; 12 ~A() { printf("A::~A()\n"); } 13}; 14 15struct B : public A { 16 B() {}; 17 B(const B& Other) : A(Other) { printf("B::B(const B&)\n"); } 18 ~B() { printf("B::~B()\n"); } 19}; 20 21struct C : public B { 22 C() {}; 23 C(const C& Other) : B(Other) { printf("C::C(const C&)\n"); } 24 ~C() { printf("C::~C()\n"); } 25}; 26 27struct X { 28 operator B&() {printf("X::operator B&()\n"); return b; } 29 operator C&() {printf("X::operator C&()\n"); return c; } 30 X (const X&) { printf("X::X(const X&)\n"); } 31 X () { printf("X::X()\n"); } 32 ~X () { printf("X::~X()\n"); } 33 B b; 34 C c; 35}; 36 37void f(A) { 38 printf("f(A)\n"); 39} 40 41 42void func(X x) 43{ 44 f (x); 45} 46 47int main() 48{ 49 X x; 50 func(x); 51} 52 53struct Base; 54 55struct Root { 56 operator Base&() { exit(1); } 57}; 58 59struct Derived; 60 61struct Base : Root { 62 Base(const Base&) { printf("Base::(const Base&)\n"); } 63 Base() { printf("Base::Base()\n"); } 64 operator Derived&() { exit(1); } 65}; 66 67struct Derived : Base { 68}; 69 70void foo(Base) {} 71 72void test(Derived bb) 73{ 74 // CHECK-LP64-NOT: callq __ZN4BasecvR7DerivedEv 75 // CHECK-LP32-NOT: callq L__ZN4BasecvR7DerivedEv 76 foo(bb); 77} 78// CHECK-LP64: callq __ZN1XcvR1BEv 79// CHECK-LP64: callq __ZN1AC1ERKS_ 80 81// CHECK-LP32: calll L__ZN1XcvR1BEv 82// CHECK-LP32: calll L__ZN1AC1ERKS_ 83 84 85