[Heikki Kultala] This patch contains the ABI changes for the TCE target.
[clang.git] / test / CodeGenCXX / derived-to-base-conv.cpp
blob006f26433712398dbd39055665e2ceae330ca266
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
6 extern "C" int printf(...);
7 extern "C" void exit(int);
9 struct A {
10 A (const A&) { printf("A::A(const A&)\n"); }
11 A() {};
12 ~A() { printf("A::~A()\n"); }
13 };
15 struct B : public A {
16 B() {};
17 B(const B& Other) : A(Other) { printf("B::B(const B&)\n"); }
18 ~B() { printf("B::~B()\n"); }
21 struct 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 };
27 struct 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;
37 void f(A) {
38 printf("f(A)\n");
42 void func(X x)
44 f (x);
47 int main()
49 X x;
50 func(x);
53 struct Base;
55 struct Root {
56 operator Base&() { exit(1); }
59 struct Derived;
61 struct Base : Root {
62 Base(const Base&) { printf("Base::(const Base&)\n"); }
63 Base() { printf("Base::Base()\n"); }
64 operator Derived&() { exit(1); }
67 struct Derived : Base {
70 void foo(Base) {}
72 void test(Derived bb)
74 // CHECK-LP64-NOT: callq __ZN4BasecvR7DerivedEv
75 // CHECK-LP32-NOT: callq L__ZN4BasecvR7DerivedEv
76 foo(bb);
78 // CHECK-LP64: callq __ZN1XcvR1BEv
79 // CHECK-LP64: callq __ZN1AC1ERKS_
81 // CHECK-LP32: calll L__ZN1XcvR1BEv
82 // CHECK-LP32: calll L__ZN1AC1ERKS_