diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-09-23 22:58:15 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-09-23 22:58:15 +0000 |
commit | c2e67539582f573c3aeb991eed5a17a9a80d939f (patch) | |
tree | 15472c3821844d3b748a3471cf724d4de26e81b2 /clang/test/Layout/ms-x86-vtordisp.cpp | |
parent | e396ba6bb0807e29c5b058b350ff00b181076626 (diff) | |
download | bcm5719-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.cpp | 26 |
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]; |