blob: 64b1f43b8c3c89a3d33466192ca8426b34bc3557 [file] [log] [blame]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +00001// RUN: %clang_cc1 %s -fno-rtti -cxx-abi microsoft -triple=i386-pc-win32 -emit-llvm -fdump-vtable-layouts -o - > %t 2>&1
2// RUN: FileCheck --check-prefix=EMITS-VTABLE %s < %t
Reid Kleckner5a8b0492013-05-29 16:18:30 +00003// RUN: FileCheck --check-prefix=NO-VTABLE %s < %t
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +00004// RUN: FileCheck --check-prefix=CHECK-A %s < %t
5// RUN: FileCheck --check-prefix=CHECK-B %s < %t
6// RUN: FileCheck --check-prefix=CHECK-C %s < %t
7// RUN: FileCheck --check-prefix=CHECK-D %s < %t
8// RUN: FileCheck --check-prefix=CHECK-E %s < %t
9// RUN: FileCheck --check-prefix=CHECK-F %s < %t
10// RUN: FileCheck --check-prefix=CHECK-G %s < %t
11
12struct A {
13 // CHECK-A: Vtable for 'A' (3 entries)
14 // CHECK-A-NEXT: 0 | void A::f()
15 // CHECK-A-NEXT: 1 | void A::g()
16 // CHECK-A-NEXT: 2 | void A::h()
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000017 virtual void f();
18 virtual void g();
19 virtual void h();
20 int ia;
21};
Reid Kleckner5a8b0492013-05-29 16:18:30 +000022A a;
23// EMITS-VTABLE-DAG: @"\01??_7A@@6B@" = linkonce_odr unnamed_addr constant [3 x i8*]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000024
25struct B : A {
26 // CHECK-B: Vtable for 'B' (5 entries)
27 // CHECK-B-NEXT: 0 | void B::f()
28 // CHECK-B-NEXT: 1 | void A::g()
29 // CHECK-B-NEXT: 2 | void A::h()
30 // CHECK-B-NEXT: 3 | void B::i()
31 // CHECK-B-NEXT: 4 | void B::j()
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000032 virtual void f(); // overrides A::f()
33 virtual void i();
34 virtual void j();
35};
Reid Kleckner5a8b0492013-05-29 16:18:30 +000036B b;
37// EMITS-VTABLE-DAG: @"\01??_7B@@6B@" = linkonce_odr unnamed_addr constant [5 x i8*]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000038
39struct C {
40 // CHECK-C: Vtable for 'C' (2 entries)
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000041 // CHECK-C-NEXT: 0 | C::~C() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000042 // CHECK-C-NEXT: 1 | void C::f()
43 // CHECK-C: VTable indices for 'C' (2 entries).
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000044 // CHECK-C-NEXT: 0 | C::~C() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000045 // CHECK-C-NEXT: 1 | void C::f()
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000046 virtual ~C();
47
48 virtual void f();
49};
50void C::f() {}
Reid Kleckner5a8b0492013-05-29 16:18:30 +000051// The usual Itanium-style key method does not cause vtable emission.
52// NO-VTABLE-NOT: @"\01??_7C@@6B@"
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000053
54struct D {
55 // CHECK-D: Vtable for 'D' (2 entries)
56 // CHECK-D-NEXT: 0 | void D::f()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000057 // CHECK-D-NEXT: 1 | D::~D() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000058 virtual void f();
59
60 virtual ~D();
61};
Reid Kleckner5a8b0492013-05-29 16:18:30 +000062D d;
63// EMITS-VTABLE-DAG: @"\01??_7D@@6B@" = linkonce_odr unnamed_addr constant [2 x i8*]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000064
65struct E : A {
66 // CHECK-E: Vtable for 'E' (5 entries)
67 // CHECK-E-NEXT: 0 | void A::f()
68 // CHECK-E-NEXT: 1 | void A::g()
69 // CHECK-E-NEXT: 2 | void A::h()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000070 // CHECK-E-NEXT: 3 | E::~E() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000071 // CHECK-E-NEXT: 4 | void E::i()
72 // CHECK-E: VTable indices for 'E' (2 entries).
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000073 // CHECK-E-NEXT: 3 | E::~E() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000074 // CHECK-E-NEXT: 4 | void E::i()
75
Reid Kleckner5a8b0492013-05-29 16:18:30 +000076 // ~E would be the key method, but it isn't used, and MS ABI has no key
77 // methods.
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000078 virtual ~E();
79 virtual void i();
80};
81void E::i() {}
Reid Kleckner5a8b0492013-05-29 16:18:30 +000082// NO-VTABLE-NOT: @"\01??_7E@@6B@"
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000083
84struct F : A {
85 // CHECK-F: Vtable for 'F' (5 entries)
86 // CHECK-F-NEXT: 0 | void A::f()
87 // CHECK-F-NEXT: 1 | void A::g()
88 // CHECK-F-NEXT: 2 | void A::h()
89 // CHECK-F-NEXT: 3 | void F::i()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000090 // CHECK-F-NEXT: 4 | F::~F() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000091 // CHECK-F: VTable indices for 'F' (2 entries).
92 // CHECK-F-NEXT: 3 | void F::i()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000093 // CHECK-F-NEXT: 4 | F::~F() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000094 virtual void i();
95 virtual ~F();
96};
Reid Kleckner5a8b0492013-05-29 16:18:30 +000097F f;
98// EMITS-VTABLE-DAG: @"\01??_7F@@6B@" = linkonce_odr unnamed_addr constant [5 x i8*]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000099
100struct G : E {
101 // CHECK-G: Vtable for 'G' (6 entries)
102 // CHECK-G-NEXT: 0 | void G::f()
103 // CHECK-G-NEXT: 1 | void A::g()
104 // CHECK-G-NEXT: 2 | void A::h()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000105 // CHECK-G-NEXT: 3 | G::~G() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +0000106 // CHECK-G-NEXT: 4 | void E::i()
107 // CHECK-G-NEXT: 5 | void G::j()
108 // CHECK-G: VTable indices for 'G' (3 entries).
109 // CHECK-G-NEXT: 0 | void G::f()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000110 // CHECK-G-NEXT: 3 | G::~G() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +0000111 // CHECK-G-NEXT: 5 | void G::j()
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +0000112 virtual void f(); // overrides A::f()
113 virtual ~G();
114 virtual void j();
115};
116void G::j() {}
Reid Kleckner5a8b0492013-05-29 16:18:30 +0000117// NO-VTABLE-NOT: @"\01??_7G@@6B@"