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