blob: 04b5fc1205fdf4a466c1dfd5e01722c12b584e3a [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// NO-VTABLE-NOT: @"\01??_7C@@6B@"
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000052
53struct D {
54 // CHECK-D: Vtable for 'D' (2 entries)
55 // CHECK-D-NEXT: 0 | void D::f()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000056 // CHECK-D-NEXT: 1 | D::~D() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000057 virtual void f();
58
59 virtual ~D();
60};
Reid Kleckner5a8b0492013-05-29 16:18:30 +000061D d;
62// EMITS-VTABLE-DAG: @"\01??_7D@@6B@" = linkonce_odr unnamed_addr constant [2 x i8*]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000063
64struct E : A {
65 // CHECK-E: Vtable for 'E' (5 entries)
66 // CHECK-E-NEXT: 0 | void A::f()
67 // CHECK-E-NEXT: 1 | void A::g()
68 // CHECK-E-NEXT: 2 | void A::h()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000069 // CHECK-E-NEXT: 3 | E::~E() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000070 // CHECK-E-NEXT: 4 | void E::i()
71 // CHECK-E: VTable indices for 'E' (2 entries).
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000072 // CHECK-E-NEXT: 3 | E::~E() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000073 // CHECK-E-NEXT: 4 | void E::i()
74
Reid Kleckner5a8b0492013-05-29 16:18:30 +000075 // ~E would be the key method, but it isn't used, and MS ABI has no key
76 // methods.
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000077 virtual ~E();
78 virtual void i();
79};
80void E::i() {}
Reid Kleckner5a8b0492013-05-29 16:18:30 +000081// NO-VTABLE-NOT: @"\01??_7E@@6B@"
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000082
83struct F : A {
84 // CHECK-F: Vtable for 'F' (5 entries)
85 // CHECK-F-NEXT: 0 | void A::f()
86 // CHECK-F-NEXT: 1 | void A::g()
87 // CHECK-F-NEXT: 2 | void A::h()
88 // CHECK-F-NEXT: 3 | void F::i()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000089 // CHECK-F-NEXT: 4 | F::~F() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000090 // CHECK-F: VTable indices for 'F' (2 entries).
91 // CHECK-F-NEXT: 3 | void F::i()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000092 // CHECK-F-NEXT: 4 | F::~F() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000093 virtual void i();
94 virtual ~F();
95};
Reid Kleckner5a8b0492013-05-29 16:18:30 +000096F f;
97// EMITS-VTABLE-DAG: @"\01??_7F@@6B@" = linkonce_odr unnamed_addr constant [5 x i8*]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +000098
99struct G : E {
100 // CHECK-G: Vtable for 'G' (6 entries)
101 // CHECK-G-NEXT: 0 | void G::f()
102 // CHECK-G-NEXT: 1 | void A::g()
103 // CHECK-G-NEXT: 2 | void A::h()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000104 // CHECK-G-NEXT: 3 | G::~G() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +0000105 // CHECK-G-NEXT: 4 | void E::i()
106 // CHECK-G-NEXT: 5 | void G::j()
107 // CHECK-G: VTable indices for 'G' (3 entries).
108 // CHECK-G-NEXT: 0 | void G::f()
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000109 // CHECK-G-NEXT: 3 | G::~G() [scalar deleting]
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +0000110 // CHECK-G-NEXT: 5 | void G::j()
Timur Iskhodzhanov649c7312013-01-21 13:02:41 +0000111 virtual void f(); // overrides A::f()
112 virtual ~G();
113 virtual void j();
114};
115void G::j() {}
Reid Kleckner5a8b0492013-05-29 16:18:30 +0000116// NO-VTABLE-NOT: @"\01??_7G@@6B@"
Reid Klecknerc72ff4f2013-05-29 16:51:17 +0000117
118// Test that the usual Itanium-style key method does not emit a vtable.
119struct H {
120 virtual void f();
121};
122void H::f() {}
123// NO-VTABLE-NOT: @"\01??_7H@@6B@"