17916c997127fe616ba255ba4cade10e5de0c8812John McCall// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -emit-llvm %s -o - | FileCheck %s
293034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian
393034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianstruct A {
47916c997127fe616ba255ba4cade10e5de0c8812John McCall  A(const A&);
57916c997127fe616ba255ba4cade10e5de0c8812John McCall  A();
67916c997127fe616ba255ba4cade10e5de0c8812John McCall  ~A();
793034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian};
893034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian
993034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianstruct B : public A {
107916c997127fe616ba255ba4cade10e5de0c8812John McCall  B();
117916c997127fe616ba255ba4cade10e5de0c8812John McCall  B(const B& Other);
127916c997127fe616ba255ba4cade10e5de0c8812John McCall  ~B();
132f59979a7cc7929f53c9984423b0abeb83113442Douglas Gregor};
1493034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian
1593034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianstruct C : public B {
167916c997127fe616ba255ba4cade10e5de0c8812John McCall  C();
177916c997127fe616ba255ba4cade10e5de0c8812John McCall  C(const C& Other);
187916c997127fe616ba255ba4cade10e5de0c8812John McCall  ~C();
1993034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian};
2093034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian
2193034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanianstruct X {
227916c997127fe616ba255ba4cade10e5de0c8812John McCall  operator B&();
237916c997127fe616ba255ba4cade10e5de0c8812John McCall  operator C&();
247916c997127fe616ba255ba4cade10e5de0c8812John McCall  X(const X&);
257916c997127fe616ba255ba4cade10e5de0c8812John McCall  X();
267916c997127fe616ba255ba4cade10e5de0c8812John McCall  ~X();
277916c997127fe616ba255ba4cade10e5de0c8812John McCall  B b;
287916c997127fe616ba255ba4cade10e5de0c8812John McCall  C c;
2993034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian};
3093034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian
317916c997127fe616ba255ba4cade10e5de0c8812John McCallvoid test0_helper(A);
327916c997127fe616ba255ba4cade10e5de0c8812John McCallvoid test0(X x) {
337916c997127fe616ba255ba4cade10e5de0c8812John McCall  test0_helper(x);
3493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL:    define void @_Z5test01X(
357916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK:      [[TMP:%.*]] = alloca [[A:%.*]], align
36ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK-NEXT: [[T0:%.*]] = call nonnull [[B:%.*]]* @_ZN1XcvR1BEv(
377916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NEXT: [[T1:%.*]] = bitcast [[B]]* [[T0]] to [[A]]*
38ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK-NEXT: call void @_ZN1AC1ERKS_([[A]]* [[TMP]], [[A]]* nonnull [[T1]])
397916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NEXT: call void @_Z12test0_helper1A([[A]]* [[TMP]])
407916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NEXT: call void @_ZN1AD1Ev([[A]]* [[TMP]])
417916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NEXT: ret void
4293034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian}
4393034ca3d025e948ddfcdd78868957efc70741a7Fariborz Jahanian
443759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianstruct Base;
453759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian
463759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianstruct Root {
477916c997127fe616ba255ba4cade10e5de0c8812John McCall  operator Base&();
483759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian};
493759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian
503759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianstruct Derived;
513759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian
523759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianstruct Base : Root {
537916c997127fe616ba255ba4cade10e5de0c8812John McCall  Base(const Base &);
547916c997127fe616ba255ba4cade10e5de0c8812John McCall  Base();
557916c997127fe616ba255ba4cade10e5de0c8812John McCall  operator Derived &();
563759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian};
573759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian
583759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanianstruct Derived : Base {
593759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian};
603759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian
617916c997127fe616ba255ba4cade10e5de0c8812John McCallvoid test1_helper(Base);
627916c997127fe616ba255ba4cade10e5de0c8812John McCallvoid test1(Derived bb) {
6393ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL:     define void @_Z5test17Derived(
647916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NOT: call {{.*}} @_ZN4BasecvR7DerivedEv(
657916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK:     call void @_ZN4BaseC1ERKS_(
667916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NOT: call {{.*}} @_ZN4BasecvR7DerivedEv(
677916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK:     call void @_Z12test1_helper4Base(
687916c997127fe616ba255ba4cade10e5de0c8812John McCall  test1_helper(bb);
693759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian}
703759a0361ec00e03584cb6f9ce64fb1f1c947336Fariborz Jahanian
717916c997127fe616ba255ba4cade10e5de0c8812John McCall// Don't crash after devirtualizing a derived-to-base conversion
727916c997127fe616ba255ba4cade10e5de0c8812John McCall// to an empty base allocated at offset zero.
737916c997127fe616ba255ba4cade10e5de0c8812John McCall// rdar://problem/11993704
747916c997127fe616ba255ba4cade10e5de0c8812John McCallclass Test2a {};
757916c997127fe616ba255ba4cade10e5de0c8812John McCallclass Test2b final : public virtual Test2a {};
767916c997127fe616ba255ba4cade10e5de0c8812John McCallvoid test2(Test2b &x) {
777916c997127fe616ba255ba4cade10e5de0c8812John McCall  Test2a &y = x;
7893ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL:    define void @_Z5test2R6Test2b(
797916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK:      [[X:%.*]] = alloca [[B:%.*]]*, align 8
807916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NEXT: [[Y:%.*]] = alloca [[A:%.*]]*, align 8
817916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NEXT: store [[B]]* {{%.*}}, [[B]]** [[X]], align 8
827916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NEXT: [[T0:%.*]] = load [[B]]** [[X]], align 8
837916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NEXT: [[T1:%.*]] = bitcast [[B]]* [[T0]] to [[A]]*
847916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NEXT: store [[A]]* [[T1]], [[A]]** [[Y]], align 8
857916c997127fe616ba255ba4cade10e5de0c8812John McCall  // CHECK-NEXT: ret void
867916c997127fe616ba255ba4cade10e5de0c8812John McCall}
87