1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -std=c++11 -fms-extensions -fno-rtti -emit-llvm -o %t.ll -fdump-vtable-layouts %s -triple=i386-pc-win32 >%t 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: FileCheck %s < %t 3152eee9f81f1b4f00e1bce655903fc78cafb1342Reid Kleckner// RUN: FileCheck --check-prefix=MANGLING %s < %t.ll 4a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 5635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct Empty { }; 6635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 7635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct A { 8635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void f(); 9635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void z(); // Useful to check there are no thunks for f() when appropriate. 10635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 11635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 12635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct B { 13635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void g(); 14635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 15635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 16635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct C: virtual A { 17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'C' (2 entries) 18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void C::f() 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 20635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'C' (1 entry) 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: vbtable index 1, vfptr at offset 0 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void C::f() 24635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 25a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7C@@6B@" 26a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void f() {} 28635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 29635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 30635de28950ef84ae26308ff734e778bad1ddde92Timur IskhodzhanovC c; 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(C *obj) { obj->f(); } 32635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 33635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct D: virtual A { 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'D' (1 entry). 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void D::h() 36635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'D' (2 entries). 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void D::f() 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 40635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'D' (2 entries). 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: via vfptr at offset 0 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void D::h() 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: via vbtable index 1, vfptr at offset 0 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void D::f() 46635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 47a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7D@@6B0@@" 48a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7D@@6BA@@@" 49a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 50635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void f(); 51635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void h(); 52635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 53635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 54635de28950ef84ae26308ff734e778bad1ddde92Timur IskhodzhanovD d; 55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(D *obj) { obj->h(); } 56635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 57635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovnamespace Test1 { 58635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 59635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct X { int x; }; 60635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 61635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov// X and A get reordered in the layout since X doesn't have a vfptr while A has. 62635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct Y : X, A { }; 63a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov// MANGLING-DAG: @"\01??_7Y@Test1@@6B@" 64635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 65635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct Z : virtual Y { 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Z(); 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test1::Y' in 'Test1::Z' (2 entries). 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void A::f() 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 70635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NOT: VFTable indices for 'Test1::Z' 72a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 73a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7Z@Test1@@6B@" 74635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 75635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 76651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesZ::Z() {} 77635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov} 78635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 79635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovnamespace Test2 { 80635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 81635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct X: virtual A, virtual B { 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'Test2::X' (1 entry). 83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test2::X::h() 84635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test2::X' (2 entries). 86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void A::f() 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 88635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'B' in 'Test2::X' (1 entry). 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void B::g() 91635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'Test2::X' (1 entry). 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test2::X::h() 94635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 95a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7X@Test2@@6B01@@" 96a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7X@Test2@@6BA@@@" 97a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7X@Test2@@6BB@@@" 98a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 99635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void h(); 100635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 101635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 102635de28950ef84ae26308ff734e778bad1ddde92Timur IskhodzhanovX x; 103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(X *obj) { obj->h(); } 104635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov} 105635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 106635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovnamespace Test3 { 107635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 108a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanovstruct X : virtual A { 109a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7X@Test3@@6B@" 110a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov}; 111635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 112635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct Y: virtual X { 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Y(); 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test3::X' in 'Test3::Y' (2 entries). 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void A::f() 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 117635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NOT: VFTable indices for 'Test3::Y' 119a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 120a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7Y@Test3@@6B@" 121635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 122635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 123651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesY::Y() {} 124635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov} 125635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 126635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovnamespace Test4 { 127635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 128635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct X: virtual C { 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines X(); 130635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov // This one's interesting. C::f expects (A*) to be passed as 'this' and does 131635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov // ECX-=4 to cast to (C*). In X, C and A vbases are reordered, so the thunk 132635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov // should pass a pointer to the end of X in order 133635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov // for ECX-=4 to point at the C part. 134635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'C' in 'Test4::X' (2 entries). 136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void C::f() 137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [this adjustment: 8 non-virtual] 138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 139651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'void C::f()' (1 entry). 141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [this adjustment: 8 non-virtual] 142635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NOT: VFTable indices for 'Test4::X' 144a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 145a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7X@Test4@@6B@" 1462cb17a06befb61b1434aaa991652fea4338c95d7Timur Iskhodzhanov 1472cb17a06befb61b1434aaa991652fea4338c95d7Timur Iskhodzhanov // Also check the mangling of the thunk. 148c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // MANGLING-DAG: define linkonce_odr x86_thiscallcc void @"\01?f@C@@WPPPPPPPI@AEXXZ" 149635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 150635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 151651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesX::X() {} 152635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov} 153635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 154635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovnamespace Test5 { 155635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 156635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov// New methods are added to the base's vftable. 157635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct X : A { 158a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7X@Test5@@6B@" 159635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void g(); 160635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 161635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 162635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct Y : virtual X { 163651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'Test5::Y' (1 entry). 164651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test5::Y::h() 165635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test5::X' in 'Test5::Y' (3 entries). 167651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void A::f() 168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 2 | void Test5::X::g() 170635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'Test5::Y' (1 entry). 172651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test5::Y::h() 173635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 174a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7Y@Test5@@6B01@@" 175a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7Y@Test5@@6BX@1@@" 176a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 177635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void h(); 178635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 179635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 180635de28950ef84ae26308ff734e778bad1ddde92Timur IskhodzhanovY y; 181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(Y *obj) { obj->h(); } 182635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov} 183635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 184635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovnamespace Test6 { 185635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 186635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct X : A, virtual Empty { 187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines X(); 188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test6::X' (2 entries). 189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void A::f() 190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 191635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NOT: VFTable indices for 'Test6::X' 193a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 194a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7X@Test6@@6B@" 195635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 196635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 197651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesX::X() {} 198635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov} 199635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 200635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovnamespace Test7 { 201635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 202a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanovstruct X : C { 203a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7X@Test7@@6B@" 204a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov}; 205635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 206635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct Y : virtual X { 207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Y(); 208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'C' in 'Test7::X' in 'Test7::Y' (2 entries). 209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void C::f() 210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [this adjustment: 8 non-virtual] 211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 212635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'void C::f()' (1 entry). 214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [this adjustment: 8 non-virtual] 215635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NOT: VFTable indices for 'Test7::Y' 217a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 218a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7Y@Test7@@6B@" 219635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 220635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 221651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesY::Y() {} 222635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov} 223635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 224635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovnamespace Test8 { 225635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 226635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov// This is a typical diamond inheritance with a shared 'A' vbase. 227635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct X : D, C { 228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'D' in 'Test8::X' (1 entry). 229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void D::h() 230635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'D' in 'Test8::X' (2 entries). 232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test8::X::f() 233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 234635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'Test8::X' (1 entry). 236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: via vbtable index 1, vfptr at offset 0 237651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test8::X::f() 238635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 239a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7X@Test8@@6BA@@@" 240a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7X@Test8@@6BD@@@" 241a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 242635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void f(); 243635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 244635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 245635de28950ef84ae26308ff734e778bad1ddde92Timur IskhodzhanovX x; 246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(X *obj) { obj->f(); } 247d647efb48af96dfc56d31736beb1052536ee81ffTimur Iskhodzhanov 248d647efb48af96dfc56d31736beb1052536ee81ffTimur Iskhodzhanov// Another diamond inheritance which led to AST crashes. 249d647efb48af96dfc56d31736beb1052536ee81ffTimur Iskhodzhanovstruct Y : virtual A {}; 250d647efb48af96dfc56d31736beb1052536ee81ffTimur Iskhodzhanov 251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct Z : Y, C { 252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test8::Y' in 'Test8::Z' (2 entries). 253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test8::Z::f() 254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 255d647efb48af96dfc56d31736beb1052536ee81ffTimur Iskhodzhanov 256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'Test8::Z' (1 entry). 257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: via vbtable index 1, vfptr at offset 0 258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test8::Z::f() 259d647efb48af96dfc56d31736beb1052536ee81ffTimur Iskhodzhanov virtual void f(); 260d647efb48af96dfc56d31736beb1052536ee81ffTimur Iskhodzhanov}; 261d647efb48af96dfc56d31736beb1052536ee81ffTimur IskhodzhanovZ z; 262651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(Z *obj) { obj->f(); } 263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Another diamond inheritance which we miscompiled (PR18967). 265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct W : virtual A { 266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void bar(); 267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct T : W, C { 270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'Test8::W' in 'Test8::T' (1 entry) 271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test8::T::bar() 272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 273651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test8::W' in 'Test8::T' (2 entries) 274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void C::f() 275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [this adjustment: -4 non-virtual] 276651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 277651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 278651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'void C::f()' (1 entry). 279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [this adjustment: -4 non-virtual] 280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void bar(); 281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int field; 282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 283651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesT t; 284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(T *obj) { obj->bar(); } 285635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov} 286635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 287635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovnamespace Test9 { 288635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 289635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct X : A { }; 290635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 291635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct Y : virtual X { 292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'Test9::Y' (1 entry). 293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::Y::h() 294635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 295651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test9::X' in 'Test9::Y' (2 entries). 296651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void A::f() 297651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 298635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'Test9::Y' (1 entry). 300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::Y::h() 301635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 302a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7Y@Test9@@6B01@@" 303a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7Y@Test9@@6BX@1@@" 304a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 305635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void h(); 306635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 307635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 308635de28950ef84ae26308ff734e778bad1ddde92Timur IskhodzhanovY y; 309651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(Y *obj) { obj->h(); } 310635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 311635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct Z : Y, virtual B { 312651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Z(); 313651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'Test9::Y' in 'Test9::Z' (1 entry). 314651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::Y::h() 315635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 316651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test9::X' in 'Test9::Y' in 'Test9::Z' (2 entries). 317651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void A::f() 318651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 319635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'B' in 'Test9::Z' (1 entry). 321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void B::g() 322635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 323651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NOT: VFTable indices for 'Test9::Z' 324a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 325a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7Z@Test9@@6BX@1@@" 326a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7Z@Test9@@6BY@1@@" 327a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 328651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // MANGLING-DAG: @"\01??_7Z@Test9@@6B@" 329635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 330635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 331651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesZ::Z() {} 332635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 333635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct W : Z, D, virtual A, virtual B { 334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines W(); 335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'Test9::Y' in 'Test9::Z' in 'Test9::W' (1 entry). 336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::Y::h() 337635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 338651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test9::X' in 'Test9::Y' in 'Test9::Z' in 'Test9::W' (2 entries). 339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void A::f() 340651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 341635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'B' in 'Test9::Z' in 'Test9::W' (1 entry). 343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void B::g() 344635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 345651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'D' in 'Test9::W' (1 entry). 346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void D::h() 347635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'D' in 'Test9::W' (2 entries). 349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void D::f() 350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [this adjustment: -8 non-virtual] 351651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 352635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'void D::f()' (1 entry). 354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [this adjustment: -8 non-virtual] 355635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 356651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NOT: VFTable indices for 'Test9::W' 357a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 358a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7W@Test9@@6BA@@@" 359a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7W@Test9@@6BD@@@" 360a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7W@Test9@@6BX@1@@" 361a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 362651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // MANGLING-DAG: @"\01??_7W@Test9@@6B@" 363651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // MANGLING-DAG: @"\01??_7W@Test9@@6BY@1@@" 364635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 365635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 366651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesW::W() {} 367635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 368635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct T : Z, D, virtual A, virtual B { 369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'Test9::Y' in 'Test9::Z' in 'Test9::T' (1 entry). 370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::T::h() 371635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 372651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test9::X' in 'Test9::Y' in 'Test9::Z' in 'Test9::T' (2 entries). 373651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::T::f() 374651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void Test9::T::z() 375635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 376651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'B' in 'Test9::Z' in 'Test9::T' (1 entry). 377651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::T::g() 378635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 379651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'D' in 'Test9::T' (1 entry). 380651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::T::h() 381651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [this adjustment: -8 non-virtual] 382635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 383651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'void Test9::T::h()' (1 entry). 384651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [this adjustment: -8 non-virtual] 385635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'D' in 'Test9::T' (2 entries). 387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::T::f() 388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [this adjustment: -8 non-virtual] 389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void Test9::T::z() 390651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [this adjustment: -8 non-virtual] 391635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'void Test9::T::f()' (1 entry). 393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [this adjustment: -8 non-virtual] 394635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'void Test9::T::z()' (1 entry). 396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [this adjustment: -8 non-virtual] 397635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'Test9::T' (4 entries). 399651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: via vfptr at offset 0 400651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::T::h() 401651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: via vbtable index 1, vfptr at offset 0 402651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::T::f() 403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void Test9::T::z() 404651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: via vbtable index 2, vfptr at offset 0 405651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test9::T::g() 406635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 407a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7T@Test9@@6BA@@@" 408a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7T@Test9@@6BD@@@" 409a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov // MANGLING-DAG: @"\01??_7T@Test9@@6BX@1@@" 410a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 411651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // MANGLING-DAG: @"\01??_7T@Test9@@6B@" 412651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // MANGLING-DAG: @"\01??_7T@Test9@@6BY@1@@" 413a53d7a0259ff88f78ba8ecac7d0cb3ea96302b1dTimur Iskhodzhanov 414635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void f(); 415635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void g(); 416635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void h(); 417635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void z(); 418635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 419635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 420635de28950ef84ae26308ff734e778bad1ddde92Timur IskhodzhanovT t; 421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(T *obj) { obj->f(); } 422635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov} 423635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 424635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovnamespace Test10 { 425635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct X : virtual C, virtual A { 426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'A' in 'C' in 'Test10::X' (2 entries). 427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test10::X::f() 428651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void A::z() 429635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 430651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'Test10::X' (1 entry). 431651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: via vbtable index 1, vfptr at offset 0 432651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void Test10::X::f() 433635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void f(); 434635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 435635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 436635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovvoid X::f() {} 437635de28950ef84ae26308ff734e778bad1ddde92Timur IskhodzhanovX x; 438651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(X *obj) { obj->f(); } 439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace Test11 { 442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct X : virtual A {}; 443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct Y { virtual void g(); }; 444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct Z : virtual X, Y { 446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // MANGLING-DAG: @"\01??_7Z@Test11@@6BY@1@@" 447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // MANGLING-DAG: @"\01??_7Z@Test11@@6BX@1@@" 448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 450651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesZ z; 451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct W : virtual X, A {}; 453651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Used to crash, PR17748. 455651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesW w; 456635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov} 457635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 4586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace Test12 { 4596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct X : B, A { }; 4606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct Y : X { 4626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual void f(); // Overrides A::f. 4636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 4646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct Z : virtual Y { 4666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test12::X' in 'Test12::Y' in 'Test12::Z' (2 entries). 4676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-NEXT: 0 | void Test12::Y::f() 4686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-NEXT: 1 | void A::z() 4696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int z; 4716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // MANGLING-DAG: @"\01??_7Z@Test12@@6BA@@@" = {{.*}}@"\01?f@Y@Test12@@UAEXXZ" 4726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 4736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct W : Z { 4756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-LABEL: VFTable for 'A' in 'Test12::X' in 'Test12::Y' in 'Test12::Z' in 'Test12::W' (2 entries). 4766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-NEXT: 0 | void Test12::Y::f() 4776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-NEXT: 1 | void A::z() 4786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines W(); 4796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int w; 4816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // MANGLING-DAG: @"\01??_7W@Test12@@6BA@@@" = {{.*}}@"\01?f@Y@Test12@@UAEXXZ" 4826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 4836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesW::W() {} 4856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 4866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 48782552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanovnamespace vdtors { 48882552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanovstruct X { 48982552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov virtual ~X(); 49082552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov virtual void zzz(); 49182552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov}; 49282552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 49382552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanovstruct Y : virtual X { 494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'vdtors::X' in 'vdtors::Y' (2 entries). 495651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | vdtors::Y::~Y() [scalar deleting] 496651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void vdtors::X::zzz() 49782552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 498651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NOT: Thunks for 'vdtors::Y::~Y()' 49982552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov virtual ~Y(); 50082552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov}; 50182552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 50282552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur IskhodzhanovY y; 503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(Y *obj) { delete obj; } 50482552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 50582552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanovstruct Z { 50682552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov virtual void z(); 50782552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov}; 50882552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 50982552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanovstruct W : Z, X { 51082552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov // Implicit virtual dtor. 51182552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov}; 51282552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 51382552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanovstruct U : virtual W { 514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'vdtors::Z' in 'vdtors::W' in 'vdtors::U' (1 entry). 515651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void vdtors::Z::z() 51682552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 517651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'vdtors::X' in 'vdtors::W' in 'vdtors::U' (2 entries). 518651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | vdtors::U::~U() [scalar deleting] 519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [this adjustment: -4 non-virtual] 520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void vdtors::X::zzz() 52182552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'vdtors::U::~U()' (1 entry). 523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [this adjustment: -4 non-virtual] 52482552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'vdtors::U' (1 entry). 526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: -- accessible via vbtable index 1, vfptr at offset 4 -- 527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | vdtors::U::~U() [scalar deleting] 52882552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov virtual ~U(); 52982552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov}; 53082552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 53182552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur IskhodzhanovU u; 532651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(U *obj) { delete obj; } 53382552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 53482552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanovstruct V : virtual W { 535651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'vdtors::Z' in 'vdtors::W' in 'vdtors::V' (1 entry). 536651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void vdtors::Z::z() 53782552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 538651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'vdtors::X' in 'vdtors::W' in 'vdtors::V' (2 entries). 539651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | vdtors::V::~V() [scalar deleting] 540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [this adjustment: -4 non-virtual] 541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void vdtors::X::zzz() 54282552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 543651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'vdtors::V::~V()' (1 entry). 544651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [this adjustment: -4 non-virtual] 54582552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'vdtors::V' (1 entry). 547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: -- accessible via vbtable index 1, vfptr at offset 4 -- 548651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | vdtors::V::~V() [scalar deleting] 54982552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov}; 55082552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 55182552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur IskhodzhanovV v; 552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(V *obj) { delete obj; } 55382552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 55482552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanovstruct T : virtual X { 55582552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov virtual ~T(); 55682552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov}; 55782552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 55882552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanovstruct P : T, Y { 559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'vdtors::X' in 'vdtors::T' in 'vdtors::P' (2 entries). 560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | vdtors::P::~P() [scalar deleting] 561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void vdtors::X::zzz() 56282552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NOT: Thunks for 'vdtors::P::~P()' 56482552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov virtual ~P(); 56582552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov}; 56682552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 56782552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur IskhodzhanovP p; 568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(P *obj) { delete obj; } 569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 570651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct Q { 571651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual ~Q(); 572651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 573651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 574651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// PR19172: Yet another diamond we miscompiled. 575651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct R : virtual Q, X { 576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'vdtors::Q' in 'vdtors::R' (1 entry). 577651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | vdtors::R::~R() [scalar deleting] 578651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [this adjustment: -8 non-virtual] 579651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 580651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'vdtors::R::~R()' (1 entry). 581651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [this adjustment: -8 non-virtual] 582651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 583651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'vdtors::X' in 'vdtors::R' (2 entries). 584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | vdtors::R::~R() [scalar deleting] 585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | void vdtors::X::zzz() 586651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 587651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'vdtors::R' (1 entry). 588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | vdtors::R::~R() [scalar deleting] 589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual ~R(); 590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 59182552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 592651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesR r; 593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(R *obj) { delete obj; } 59482552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov} 59582552742a1002cf1408d6f371efc9cc6a9f2d7ccTimur Iskhodzhanov 596635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovnamespace return_adjustment { 597635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 598635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct X : virtual A { 599635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void f(); 600635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 601635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 602635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct Y : virtual A, virtual X { 603635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual void f(); 604635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 605635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 606635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct Z { 607635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual A* foo(); 608635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 609635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 610635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct W : Z { 611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'return_adjustment::Z' in 'return_adjustment::W' (2 entries). 612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | return_adjustment::X *return_adjustment::W::foo() 613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [return adjustment (to type 'struct A *'): vbase #1, 0 non-virtual] 614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | return_adjustment::X *return_adjustment::W::foo() 615635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'return_adjustment::X *return_adjustment::W::foo()' (1 entry). 617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [return adjustment (to type 'struct A *'): vbase #1, 0 non-virtual] 618651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 619651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'return_adjustment::W' (1 entry). 620651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | return_adjustment::X *return_adjustment::W::foo() 621635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 622635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual X* foo(); 623635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 624635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 625651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesW w; 626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(W *obj) { obj->foo(); } 627635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 628635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanovstruct T : W { 629651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'return_adjustment::Z' in 'return_adjustment::W' in 'return_adjustment::T' (3 entries). 630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | return_adjustment::Y *return_adjustment::T::foo() 631651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [return adjustment (to type 'struct A *'): vbase #1, 0 non-virtual] 632651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | return_adjustment::Y *return_adjustment::T::foo() 633651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [return adjustment (to type 'struct return_adjustment::X *'): vbase #2, 0 non-virtual] 634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 2 | return_adjustment::Y *return_adjustment::T::foo() 635635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'return_adjustment::Y *return_adjustment::T::foo()' (2 entries). 637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [return adjustment (to type 'struct A *'): vbase #1, 0 non-virtual] 638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | [return adjustment (to type 'struct return_adjustment::X *'): vbase #2, 0 non-virtual] 639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'return_adjustment::T' (1 entry). 641651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 2 | return_adjustment::Y *return_adjustment::T::foo() 642635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 643635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov virtual Y* foo(); 644635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov}; 645635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov 646635de28950ef84ae26308ff734e778bad1ddde92Timur IskhodzhanovT t; 647651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(T *obj) { obj->foo(); } 648c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanov 649c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanovstruct U : virtual A { 650c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanov virtual void g(); // adds a vfptr 651c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanov}; 652c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanov 653c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanovstruct V : Z { 654651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'return_adjustment::Z' in 'return_adjustment::V' (2 entries). 655651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | return_adjustment::U *return_adjustment::V::foo() 656651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: [return adjustment (to type 'struct A *'): vbptr at offset 4, vbase #1, 0 non-virtual] 657651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | return_adjustment::U *return_adjustment::V::foo() 658651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 659651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: Thunks for 'return_adjustment::U *return_adjustment::V::foo()' (1 entry). 660651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | [return adjustment (to type 'struct A *'): vbptr at offset 4, vbase #1, 0 non-virtual] 661c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanov 662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable indices for 'return_adjustment::V' (1 entry). 663651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 1 | return_adjustment::U *return_adjustment::V::foo() 664c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanov 665c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanov virtual U* foo(); 666c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanov}; 667c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanov 668c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur IskhodzhanovV v; 669651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid use(V *obj) { obj->foo(); } 670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace pr17748 { 673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct A { 674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void f() {} 675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 676651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct B : virtual A { 678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines B() {} 679651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 680651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 681651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct C : virtual B, A { 682651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines C() {} 683651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 684651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesC c; 685651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 686651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// MANGLING-DAG: @"\01??_7A@pr17748@@6B@" 687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// MANGLING-DAG: @"\01??_7B@pr17748@@6B@" 688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// MANGLING-DAG: @"\01??_7C@pr17748@@6BA@1@@" 689651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// MANGLING-DAG: @"\01??_7C@pr17748@@6BB@1@@" 690651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 691651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 692651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace pr19066 { 693651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct X : virtual B {}; 694651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 695651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct Y : virtual X, B { 696651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Y(); 697651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'B' in 'pr19066::X' in 'pr19066::Y' (1 entry). 698651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void B::g() 699651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 700651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-LABEL: VFTable for 'B' in 'pr19066::Y' (1 entry). 701651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // CHECK-NEXT: 0 | void B::g() 702651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 703651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 704651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesY::Y() {} 705651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 706651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 707651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace pr19240 { 708651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct A { 709651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void c(); 710651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 711651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 712651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct B : virtual A { 713651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines virtual void c(); 714651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}; 715651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 716651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct C { }; 717651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 718651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct D : virtual A, virtual C, B {}; 719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 720651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesD obj; 721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 722651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Each MDC only has one vftable. 723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 724651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// MANGLING-DAG: @"\01??_7D@pr19240@@6B@" 725651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// MANGLING-DAG: @"\01??_7A@pr19240@@6B@" 726651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// MANGLING-DAG: @"\01??_7B@pr19240@@6B@" 727651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 728635de28950ef84ae26308ff734e778bad1ddde92Timur Iskhodzhanov} 7296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace pr19408 { 7316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// This test is a non-vtordisp version of the reproducer for PR19408. 7326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct X : virtual A { 7336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int x; 7346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 7356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct Y : X { 7376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines virtual void f(); 7386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int y; 7396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 7406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct Z : Y { 7426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-LABEL: VFTable for 'A' in 'pr19408::X' in 'pr19408::Y' in 'pr19408::Z' (2 entries). 7436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-NEXT: 0 | void pr19408::Y::f() 7446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-NEXT: [this adjustment: -4 non-virtual] 7456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-NEXT: 1 | void A::z() 7466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Z(); 7486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int z; 7496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // MANGLING-DAG: @"\01??_7Z@pr19408@@6B@" = {{.*}}@"\01?f@Y@pr19408@@W3AEXXZ" 7506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 7516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesZ::Z() {} 7536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct W : B, Y { 7556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-LABEL: VFTable for 'A' in 'pr19408::X' in 'pr19408::Y' in 'pr19408::W' (2 entries). 7566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-NEXT: 0 | void pr19408::Y::f() 7576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-NEXT: [this adjustment: -4 non-virtual] 7586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // CHECK-NEXT: 1 | void A::z() 7596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines W(); 7616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines int w; 7626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // MANGLING-DAG: @"\01??_7W@pr19408@@6BY@1@@" = {{.*}}@"\01?f@Y@pr19408@@W3AEXXZ" 7636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 7646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 7656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesW::W() {} 7666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 767176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 768176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace Test13 { 769176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct A { 770176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines virtual void f(); 771176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 772176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct __declspec(dllexport) B : virtual A { 773176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines virtual void f() = 0; 774176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // MANGLING-DAG: @"\01??_7B@Test13@@6B@" = weak_odr dllexport unnamed_addr constant [1 x i8*] [i8* bitcast (void ()* @_purecall to i8*)] 775176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 776176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 777176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 778176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace pr21031_1 { 779176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// This ordering of base specifiers regressed in r202425. 780176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct A { virtual void f(void); }; 781176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct B : virtual A { virtual void g(void); }; 782176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct C : virtual A, B { C(); }; 783176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesC::C() {} 784176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 785176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: VFTable for 'pr21031_1::A' in 'pr21031_1::B' in 'pr21031_1::C' (1 entry) 786176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-NEXT: 0 | void pr21031_1::A::f() 787176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 788176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: VFTable for 'pr21031_1::B' in 'pr21031_1::C' (1 entry) 789176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-NEXT: 0 | void pr21031_1::B::g() 790176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 791176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// MANGLING-DAG: @"\01??_7C@pr21031_1@@6BB@1@@" = {{.*}} constant [1 x i8*] 792176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// MANGLING-DAG: @"\01??_7C@pr21031_1@@6B@" = {{.*}} constant [1 x i8*] 793176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 794176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 795176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace pr21031_2 { 796176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct A { virtual void f(void); }; 797176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct B : virtual A { virtual void g(void); }; 798176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct C : B, virtual A { C(); }; 799176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesC::C() {} 800176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 801176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: VFTable for 'pr21031_2::B' in 'pr21031_2::C' (1 entry) 802176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-NEXT: 0 | void pr21031_2::B::g() 803176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 804176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: VFTable for 'pr21031_2::A' in 'pr21031_2::B' in 'pr21031_2::C' (1 entry) 805176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-NEXT: 0 | void pr21031_2::A::f() 806176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 807176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// MANGLING-DAG: @"\01??_7C@pr21031_2@@6BA@1@@" = {{.*}} constant [1 x i8*] 808176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// MANGLING-DAG: @"\01??_7C@pr21031_2@@6BB@1@@" = {{.*}} constant [1 x i8*] 809176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 810b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 811b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarnamespace pr21062_1 { 812b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct A { virtual void f(); }; 813b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct B {}; 814b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct C : virtual B {}; 815b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct D : virtual C, virtual B, virtual A { D();}; 816b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarD::D() {} 817b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 818b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK-LABEL: VFTable for 'pr21062_1::A' in 'pr21062_1::D' (1 entry) 819b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK-NEXT: 0 | void pr21062_1::A::f() 820b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 821b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// MANGLING-DAG: @"\01??_7D@pr21062_1@@6B@" = {{.*}} constant [1 x i8*] 822b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 823b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 824b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarnamespace pr21062_2 { 825b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct A { virtual void f(); }; 826b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct B {}; 827b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct C : virtual B {}; 828b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct D : C, virtual B, virtual A { D(); }; 829b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarD::D() {} 830b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 831b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK-LABEL: VFTable for 'pr21062_2::A' in 'pr21062_2::D' (1 entry) 832b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK-NEXT: 0 | void pr21062_2::A::f() 833b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 834b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// MANGLING-DAG: @"\01??_7D@pr21062_2@@6B@" = {{.*}} constant [1 x i8*] 835b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 836b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 837b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarnamespace pr21064 { 838b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct A {}; 839b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct B { virtual void f(); }; 840b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct C : virtual A, virtual B {}; 841b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct D : virtual A, virtual C { D(); }; 842b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarD::D() {} 843b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK-LABEL: VFTable for 'pr21064::B' in 'pr21064::C' in 'pr21064::D' (1 entry) 844b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK-NEXT: 0 | void pr21064::B::f() 845b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar 846b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// MANGLING-DAG: @"\01??_7D@pr21064@@6B@" = {{.*}} constant [1 x i8*] 847b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar} 848