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