summaryrefslogtreecommitdiffstats
path: root/clang/test/Layout/ms-x86-vtordisp.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-09-23 22:58:15 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-09-23 22:58:15 +0000
commitc2e67539582f573c3aeb991eed5a17a9a80d939f (patch)
tree15472c3821844d3b748a3471cf724d4de26e81b2 /clang/test/Layout/ms-x86-vtordisp.cpp
parente396ba6bb0807e29c5b058b350ff00b181076626 (diff)
downloadbcm5719-llvm-c2e67539582f573c3aeb991eed5a17a9a80d939f.tar.gz
bcm5719-llvm-c2e67539582f573c3aeb991eed5a17a9a80d939f.zip
MS ABI: Pure virtual functions don't contribute to vtordisps
Usually, overriding a virtual function defined in a virtual base required emission of a vtordisp slot in the record. However no vtordisp is needed if the overriding function is pure; it should be impossible to observe the pure virtual method. This fixes PR21046. llvm-svn: 218340
Diffstat (limited to 'clang/test/Layout/ms-x86-vtordisp.cpp')
-rw-r--r--clang/test/Layout/ms-x86-vtordisp.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/clang/test/Layout/ms-x86-vtordisp.cpp b/clang/test/Layout/ms-x86-vtordisp.cpp
index 60779fb1975..1b78d9fe843 100644
--- a/clang/test/Layout/ms-x86-vtordisp.cpp
+++ b/clang/test/Layout/ms-x86-vtordisp.cpp
@@ -416,6 +416,31 @@ struct HC : virtual HB {};
// CHECK-X64-NEXT: | [sizeof=32, align=8
// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
+struct IA {
+ virtual void f();
+};
+struct __declspec(dllexport) IB : virtual IA {
+ virtual void f() = 0;
+ IB() {}
+};
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct IB
+// CHECK-NEXT: 0 | (IB vbtable pointer)
+// CHECK-NEXT: 4 | struct IA (virtual base)
+// CHECK-NEXT: 4 | (IA vftable pointer)
+// CHECK-NEXT: | [sizeof=8, align=4
+// CHECK-NEXT: | nvsize=4, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct IB
+// CHECK-X64-NEXT: 0 | (IB vbtable pointer)
+// CHECK-X64-NEXT: 8 | struct IA (virtual base)
+// CHECK-X64-NEXT: 8 | (IA vftable pointer)
+// CHECK-X64-NEXT: | [sizeof=16, align=8
+// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
+
int a[
sizeof(A)+
sizeof(C)+
@@ -428,4 +453,5 @@ sizeof(pragma_test3::C)+
sizeof(pragma_test4::C)+
sizeof(GD)+
sizeof(HC)+
+sizeof(IB)+
0];
OpenPOWER on IntegriCloud