derived-to-base-conv.cpp revision 93ab6bf534fb6c26563c00f28a8fc5581bb71dfd
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 367916c997127fe616ba255ba4cade10e5de0c8812John McCall // CHECK-NEXT: [[T0:%.*]] = call [[B:%.*]]* @_ZN1XcvR1BEv( 377916c997127fe616ba255ba4cade10e5de0c8812John McCall // CHECK-NEXT: [[T1:%.*]] = bitcast [[B]]* [[T0]] to [[A]]* 387916c997127fe616ba255ba4cade10e5de0c8812John McCall // CHECK-NEXT: call void @_ZN1AC1ERKS_([[A]]* [[TMP]], [[A]]* [[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