1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm-only -fdump-vtable-layouts > %t 2>/dev/null
29984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-1 %s < %t
39984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-2 %s < %t
49984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-3 %s < %t
59984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-4 %s < %t
69984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-5 %s < %t
79984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-6 %s < %t
89984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-7 %s < %t
99984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-8 %s < %t
109984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-9 %s < %t
119984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-10 %s < %t
129984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// RUN: FileCheck --check-prefix=CHECK-11 %s < %t
13be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson
14be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson/// Examples from the Itanium C++ ABI specification.
15be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson/// http://www.codesourcery.com/public/cxx-abi/
16be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson
17be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlssonnamespace Test1 {
18be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson
19be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson// This is from http://www.codesourcery.com/public/cxx-abi/cxx-vtable-ex.html
20be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson
219984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1:      Vtable for 'Test1::A' (5 entries).
229984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT:    0 | offset_to_top (0)
239984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT:    1 | Test1::A RTTI
249984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT:        -- (Test1::A, 0) vtable address --
259984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT:    2 | void Test1::A::f()
269984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT:    3 | void Test1::A::g()
279984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-1-NEXT:    4 | void Test1::A::h()
28be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlssonstruct A {
29be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson  virtual void f ();
30be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson  virtual void g ();
31be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson  virtual void h ();
32be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson  int ia;
33be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson};
34be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlssonvoid A::f() {}
35eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson
369984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2:      Vtable for 'Test1::B' (13 entries).
379984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:    0 | vbase_offset (16)
389984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:    1 | offset_to_top (0)
399984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:    2 | Test1::B RTTI
409984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:        -- (Test1::B, 0) vtable address --
419984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:    3 | void Test1::B::f()
429984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:    4 | void Test1::B::h()
439984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:    5 | vcall_offset (-16)
449984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:    6 | vcall_offset (0)
459984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:    7 | vcall_offset (-16)
469984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:    8 | offset_to_top (-16)
479984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:    9 | Test1::B RTTI
489984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:        -- (Test1::A, 16) vtable address --
499984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:   10 | void Test1::B::f()
509984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:        [this adjustment: 0 non-virtual, -24 vcall offset offset]
519984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:   11 | void Test1::A::g()
529984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:   12 | void Test1::B::h()
539984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-2-NEXT:        [this adjustment: 0 non-virtual, -40 vcall offset offset]
54eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlssonstruct B: public virtual A {
55eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson  void f ();
56eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson  void h ();
57eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson  int ib;
58eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlsson};
59eb577d0df44df4df974e9b3a538575d92358a3b3Anders Carlssonvoid B::f() {}
6054d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson
619984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3:      Vtable for 'Test1::C' (13 entries).
629984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:    0 | vbase_offset (16)
639984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:    1 | offset_to_top (0)
649984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:    2 | Test1::C RTTI
659984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:        -- (Test1::C, 0) vtable address --
669984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:    3 | void Test1::C::g()
679984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:    4 | void Test1::C::h()
689984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:    5 | vcall_offset (-16)
699984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:    6 | vcall_offset (-16)
709984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:    7 | vcall_offset (0)
719984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:    8 | offset_to_top (-16)
729984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:    9 | Test1::C RTTI
739984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:        -- (Test1::A, 16) vtable address --
749984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:   10 | void Test1::A::f()
759984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:   11 | void Test1::C::g()
769984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:        [this adjustment: 0 non-virtual, -32 vcall offset offset]
779984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:   12 | void Test1::C::h()
789984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-3-NEXT:        [this adjustment: 0 non-virtual, -40 vcall offset offset]
7954d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlssonstruct C: public virtual A {
8054d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson  void g ();
8154d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson  void h ();
8254d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson  int ic;
8354d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlsson};
8454d9a78b2ca41b89f5dc8ec6688086db59667495Anders Carlssonvoid C::g() {}
858b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson
869984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4:      Vtable for 'Test1::D' (18 entries).
879984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:    0 | vbase_offset (32)
889984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:    1 | offset_to_top (0)
899984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:    2 | Test1::D RTTI
909984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:        -- (Test1::B, 0) vtable address --
919984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:        -- (Test1::D, 0) vtable address --
929984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:    3 | void Test1::B::f()
939984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:    4 | void Test1::D::h()
949984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:    5 | vbase_offset (16)
959984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:    6 | offset_to_top (-16)
969984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:    7 | Test1::D RTTI
979984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:        -- (Test1::C, 16) vtable address --
989984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:    8 | void Test1::C::g()
999984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:    9 | void Test1::D::h()
1009984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:        [this adjustment: -16 non-virtual]
1019984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:   10 | vcall_offset (-32)
1029984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:   11 | vcall_offset (-16)
1039984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:   12 | vcall_offset (-32)
1049984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:   13 | offset_to_top (-32)
1059984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:   14 | Test1::D RTTI
1069984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:        -- (Test1::A, 32) vtable address --
1079984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:   15 | void Test1::B::f()
1089984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:        [this adjustment: 0 non-virtual, -24 vcall offset offset]
1099984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:   16 | void Test1::C::g()
1109984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:        [this adjustment: 0 non-virtual, -32 vcall offset offset]
1119984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:   17 | void Test1::D::h()
1129984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-4-NEXT:        [this adjustment: 0 non-virtual, -40 vcall offset offset]
1138b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlssonstruct D: public B, public C {
1148b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson  void h ();
1158b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson  int id;
1168b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson};
1178b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlssonvoid D::h() { }
1188b6765fb563a5b03d128d8f53b9b3986128a3405Anders Carlsson
119f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlssonstruct X {
120f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson  int ix;
121f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson  virtual void x();
122f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson};
123f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson
1249984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5:      Vtable for 'Test1::E' (24 entries).
1259984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:    0 | vbase_offset (56)
1269984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:    1 | offset_to_top (0)
1279984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:    2 | Test1::E RTTI
1289984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        -- (Test1::E, 0) vtable address --
1299984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        -- (Test1::X, 0) vtable address --
1309984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:    3 | void Test1::X::x()
1319984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:    4 | void Test1::E::f()
1329984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:    5 | void Test1::E::h()
1339984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:    6 | vbase_offset (40)
1349984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:    7 | offset_to_top (-16)
1359984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:    8 | Test1::E RTTI
1369984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        -- (Test1::B, 16) vtable address --
1379984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        -- (Test1::D, 16) vtable address --
1389984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:    9 | void Test1::E::f()
1399984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        [this adjustment: -16 non-virtual]
1409984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   10 | void Test1::E::h()
1419984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        [this adjustment: -16 non-virtual]
1429984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   11 | vbase_offset (24)
1439984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   12 | offset_to_top (-32)
1449984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   13 | Test1::E RTTI
1459984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        -- (Test1::C, 32) vtable address --
1469984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   14 | void Test1::C::g()
1479984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   15 | void Test1::E::h()
1489984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        [this adjustment: -32 non-virtual]
1499984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   16 | vcall_offset (-56)
1509984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   17 | vcall_offset (-24)
1519984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   18 | vcall_offset (-56)
1529984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   19 | offset_to_top (-56)
1539984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   20 | Test1::E RTTI
1549984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        -- (Test1::A, 56) vtable address --
1559984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   21 | void Test1::E::f()
1569984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        [this adjustment: 0 non-virtual, -24 vcall offset offset]
1579984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   22 | void Test1::C::g()
1589984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        [this adjustment: 0 non-virtual, -32 vcall offset offset]
1599984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:   23 | void Test1::E::h()
1609984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-5-NEXT:        [this adjustment: 0 non-virtual, -40 vcall offset offset]
161f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlssonstruct E : X, D {
162f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson  int ie;
163f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson  void f();
164f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson  void h ();
165f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson};
166f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlssonvoid E::f() { }
167f2349fc7e2b3e920a19adaf3519b278ac38d228bAnders Carlsson
168be71e3b28a1440fe08c45ecbe25899d99235c309Anders Carlsson}
1695edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson
1705edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonnamespace Test2 {
1715edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson
1725edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson// From http://www.codesourcery.com/public/cxx-abi/abi.html#class-types.
1735edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson
1745edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonstruct A { virtual void f(); };
1755edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonstruct B : virtual public A { int i; };
1765edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonstruct C : virtual public A { int j; };
1775edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson
1789984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6:      Vtable for 'Test2::D' (11 entries).
1799984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:    0 | vbase_offset (0)
1809984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:    1 | vcall_offset (0)
1819984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:    2 | offset_to_top (0)
1829984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:    3 | Test2::D RTTI
1839984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:        -- (Test2::A, 0) vtable address --
1849984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:        -- (Test2::B, 0) vtable address --
1859984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:        -- (Test2::D, 0) vtable address --
1869984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:    4 | void Test2::A::f()
1879984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:    5 | void Test2::D::d()
1889984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:    6 | vbase_offset (-16)
1899984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:    7 | vcall_offset (-16)
1909984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:    8 | offset_to_top (-16)
1919984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:    9 | Test2::D RTTI
1929984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:        -- (Test2::C, 16) vtable address --
1939984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-6-NEXT:   10 | [unused] void Test2::A::f()
1945edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonstruct D : public B, public C {
1955edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson  virtual void d();
1965edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson};
1975edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlssonvoid D::d() { }
1985edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson
1995edcc3752563ae0ed5b26f8c89a472ac84af9cf7Anders Carlsson}
200db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson
201db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonnamespace Test3 {
202db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson
203db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson// From http://www.codesourcery.com/public/cxx-abi/abi-examples.html#vtable-ctor
204db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson
205db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonstruct V1 {
206db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson  int v1;
207db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson  virtual void f();
208db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson};
209db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson
210db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonstruct V2 : virtual V1 {
211db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson  int v2;
212db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson  virtual void f();
213db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson};
214db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson
2159984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7:      Vtable for 'Test3::C' (14 entries).
2169984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:    0 | vbase_offset (32)
2179984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:    1 | vbase_offset (16)
2189984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:    2 | offset_to_top (0)
2199984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:    3 | Test3::C RTTI
2209984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:        -- (Test3::C, 0) vtable address --
2219984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:    4 | void Test3::C::f()
2229984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:    5 | vcall_offset (-16)
2239984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:    6 | offset_to_top (-16)
2249984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:    7 | Test3::C RTTI
2259984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:        -- (Test3::V1, 16) vtable address --
2269984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:    8 | void Test3::C::f()
2279984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:        [this adjustment: 0 non-virtual, -24 vcall offset offset]
2289984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:    9 | vcall_offset (-32)
2299984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:   10 | vbase_offset (-16)
2309984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:   11 | offset_to_top (-32)
2319984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:   12 | Test3::C RTTI
2329984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:        -- (Test3::V2, 32) vtable address --
2339984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:   13 | void Test3::C::f()
2349984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-7-NEXT:        [this adjustment: 0 non-virtual, -32 vcall offset offset]
235db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson
2369984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8:      Construction vtable for ('Test3::V2', 32) in 'Test3::C' (9 entries).
2379984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:    0 | vcall_offset (0)
2389984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:    1 | vbase_offset (-16)
2399984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:    2 | offset_to_top (0)
2409984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:    3 | Test3::V2 RTTI
2419984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:        -- (Test3::V2, 32) vtable address --
2429984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:    4 | void Test3::V2::f()
2439984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:    5 | vcall_offset (16)
2449984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:    6 | offset_to_top (16)
2459984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:    7 | Test3::V2 RTTI
2469984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:        -- (Test3::V1, 16) vtable address --
2479984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:    8 | void Test3::V2::f()
2489984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-8-NEXT:        [this adjustment: 0 non-virtual, -24 vcall offset offset]
249db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonstruct C : virtual V1, virtual V2 {
250db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson  int c;
251db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson  virtual void f();
252db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson};
253db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonvoid C::f() { }
254db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson
255db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonstruct B {
256db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson  int b;
257db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson};
258db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson
2599984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9:      Vtable for 'Test3::D' (15 entries).
2609984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:    0 | vbase_offset (40)
2619984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:    1 | vbase_offset (24)
2629984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:    2 | offset_to_top (0)
2639984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:    3 | Test3::D RTTI
2649984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:        -- (Test3::C, 0) vtable address --
2659984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:        -- (Test3::D, 0) vtable address --
2669984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:    4 | void Test3::C::f()
2679984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:    5 | void Test3::D::g()
2689984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:    6 | vcall_offset (-24)
2699984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:    7 | offset_to_top (-24)
2709984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:    8 | Test3::D RTTI
2719984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:        -- (Test3::V1, 24) vtable address --
2729984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:    9 | void Test3::C::f()
2739984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:        [this adjustment: 0 non-virtual, -24 vcall offset offset]
2749984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:   10 | vcall_offset (-40)
2759984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:   11 | vbase_offset (-16)
2769984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:   12 | offset_to_top (-40)
2779984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:   13 | Test3::D RTTI
2789984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:        -- (Test3::V2, 40) vtable address --
2799984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:   14 | void Test3::C::f()
2809984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-9-NEXT:        [this adjustment: 0 non-virtual, -32 vcall offset offset]
281db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson
2829984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10:      Construction vtable for ('Test3::C', 0) in 'Test3::D' (14 entries).
2839984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:    0 | vbase_offset (40)
2849984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:    1 | vbase_offset (24)
2859984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:    2 | offset_to_top (0)
2869984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:    3 | Test3::C RTTI
2879984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:        -- (Test3::C, 0) vtable address --
2889984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:    4 | void Test3::C::f()
2899984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:    5 | vcall_offset (-24)
2909984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:    6 | offset_to_top (-24)
2919984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:    7 | Test3::C RTTI
2929984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:        -- (Test3::V1, 24) vtable address --
2939984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:    8 | void Test3::C::f()
2949984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:        [this adjustment: 0 non-virtual, -24 vcall offset offset]
2959984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:    9 | vcall_offset (-40)
2969984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:   10 | vbase_offset (-16)
2979984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:   11 | offset_to_top (-40)
2989984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:   12 | Test3::C RTTI
2999984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:        -- (Test3::V2, 40) vtable address --
3009984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:   13 | void Test3::C::f()
3019984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-10-NEXT:        [this adjustment: 0 non-virtual, -32 vcall offset offset]
302db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson
3039984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11:      Construction vtable for ('Test3::V2', 40) in 'Test3::D' (9 entries).
3049984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:    0 | vcall_offset (0)
3059984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:    1 | vbase_offset (-16)
3069984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:    2 | offset_to_top (0)
3079984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:    3 | Test3::V2 RTTI
3089984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:        -- (Test3::V2, 40) vtable address --
3099984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:    4 | void Test3::V2::f()
3109984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:    5 | vcall_offset (16)
3119984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:    6 | offset_to_top (16)
3129984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:    7 | Test3::V2 RTTI
3139984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:        -- (Test3::V1, 24) vtable address --
3149984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:    8 | void Test3::V2::f()
3159984d12729206c9c8d8009ed7eaab5be18c7ce89Peter Collingbourne// CHECK-11-NEXT:        [this adjustment: 0 non-virtual, -24 vcall offset offset]
316db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonstruct D : B, C {
317db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson  int d;
318db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson  virtual void g();
319db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson};
320db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlssonvoid D::g() { }
321db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson
322db4022cf95d80afd28b5fd1273f5be62c891a230Anders Carlsson}
323