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