summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-07-16 07:16:58 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-07-16 07:16:58 +0000
commitbf3d4301634240a29aadf5bd6be25b4acb08575d (patch)
tree606f4d005118f6766544622905084492c52325fb /clang/test
parent1272764b182e81781552954a7ffe867984eddc56 (diff)
downloadbcm5719-llvm-bf3d4301634240a29aadf5bd6be25b4acb08575d.tar.gz
bcm5719-llvm-bf3d4301634240a29aadf5bd6be25b4acb08575d.zip
MS ABI: Up the required alignment after inserting padding between vbases
We would correctly insert sufficiently aligned padding between vbases when our leading base was empty, however we would neglect to increase the required alignment of the most derived class. This fixes PR20315. llvm-svn: 213123
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/Layout/ms-x86-pack-and-align.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/clang/test/Layout/ms-x86-pack-and-align.cpp b/clang/test/Layout/ms-x86-pack-and-align.cpp
index be0499c2cbb..73984652aeb 100644
--- a/clang/test/Layout/ms-x86-pack-and-align.cpp
+++ b/clang/test/Layout/ms-x86-pack-and-align.cpp
@@ -544,6 +544,60 @@ struct RE {
// CHECK-X64-NEXT: | [sizeof=1029, align=1
// CHECK-X64-NEXT: | nvsize=1029, nvalign=1]
+struct NA {};
+struct NB {};
+#pragma pack(push, 1)
+struct NC : virtual NA, virtual NB {};
+#pragma pack(pop)
+struct ND : NC {};
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct NA (empty)
+// CHECK-NEXT: | [sizeof=1, align=1
+// CHECK-NEXT: | nvsize=0, nvalign=1]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct NB (empty)
+// CHECK-NEXT: | [sizeof=1, align=1
+// CHECK-NEXT: | nvsize=0, nvalign=1]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct NC
+// CHECK-NEXT: 0 | (NC vbtable pointer)
+// CHECK-NEXT: 4 | struct NA (virtual base) (empty)
+// CHECK-NEXT: 8 | struct NB (virtual base) (empty)
+// CHECK-NEXT: | [sizeof=8, align=1
+// CHECK-NEXT: | nvsize=4, nvalign=1]
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct ND
+// CHECK-NEXT: 0 | struct NC (base)
+// CHECK-NEXT: 0 | (NC vbtable pointer)
+// CHECK-NEXT: 4 | struct NA (virtual base) (empty)
+// CHECK-NEXT: 8 | struct NB (virtual base) (empty)
+// CHECK-NEXT: | [sizeof=8, align=4
+// CHECK-NEXT: | nvsize=4, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct NA (empty)
+// CHECK-X64-NEXT: | [sizeof=1, align=1
+// CHECK-X64-NEXT: | nvsize=0, nvalign=1]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct NB (empty)
+// CHECK-X64-NEXT: | [sizeof=1, align=1
+// CHECK-X64-NEXT: | nvsize=0, nvalign=1]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct NC
+// CHECK-X64-NEXT: 0 | (NC vbtable pointer)
+// CHECK-X64-NEXT: 8 | struct NA (virtual base) (empty)
+// CHECK-X64-NEXT: 12 | struct NB (virtual base) (empty)
+// CHECK-X64-NEXT: | [sizeof=12, align=1
+// CHECK-X64-NEXT: | nvsize=8, nvalign=1]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct ND
+// CHECK-X64-NEXT: 0 | struct NC (base)
+// CHECK-X64-NEXT: 0 | (NC vbtable pointer)
+// CHECK-X64-NEXT: 8 | struct NA (virtual base) (empty)
+// CHECK-X64-NEXT: 12 | struct NB (virtual base) (empty)
+// CHECK-X64-NEXT: | [sizeof=12, align=4
+// CHECK-X64-NEXT: | nvsize=8, nvalign=4]
+
int a[
sizeof(X)+
sizeof(Y)+
@@ -568,4 +622,5 @@ sizeof(RB2)+
sizeof(RB3)+
sizeof(RC)+
sizeof(RE)+
+sizeof(ND)+
0];
OpenPOWER on IntegriCloud