summaryrefslogtreecommitdiffstats
path: root/clang/test/Layout/ms-x86-alias-avoidance-padding.cpp
diff options
context:
space:
mode:
authorWarren Hunt <whunt@google.com>2014-01-13 19:55:52 +0000
committerWarren Hunt <whunt@google.com>2014-01-13 19:55:52 +0000
commitbadf9e0f84a57e825ce1214a3a3f4bd10d867ff2 (patch)
tree8182e3df49e9b68ebb6cf82c91aa1be8e88f922e /clang/test/Layout/ms-x86-alias-avoidance-padding.cpp
parent50501fbe38305b0753d6b8f853ab202bba2152df (diff)
downloadbcm5719-llvm-badf9e0f84a57e825ce1214a3a3f4bd10d867ff2.tar.gz
bcm5719-llvm-badf9e0f84a57e825ce1214a3a3f4bd10d867ff2.zip
[ms-abi] Leading VFPtrs don't suppress the leading zero sized flag
The MS-ABI tracks a bit that asserts that the first sub-object is zero sized. This bit is used to add padding between objects if there's the potential for zero sized objects to alias. The bit is still true even if the zero sized base is lead by a VFPtr. This patch makes clang mimic that behavior. llvm-svn: 199132
Diffstat (limited to 'clang/test/Layout/ms-x86-alias-avoidance-padding.cpp')
-rw-r--r--clang/test/Layout/ms-x86-alias-avoidance-padding.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/clang/test/Layout/ms-x86-alias-avoidance-padding.cpp b/clang/test/Layout/ms-x86-alias-avoidance-padding.cpp
index 48249137017..3112b39c9bc 100644
--- a/clang/test/Layout/ms-x86-alias-avoidance-padding.cpp
+++ b/clang/test/Layout/ms-x86-alias-avoidance-padding.cpp
@@ -255,10 +255,54 @@ struct F : virtual D, virtual B {};
// CHECK-X64-NEXT: | [sizeof=32, align=8
// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
+struct JC0 {
+ JC0() { printf("JC0 : %d\n", (int)((char*)this - buffer)); }
+};
+struct JC1 : JC0 {
+ virtual void f() {}
+ JC1() { printf("JC1 : %d\n", (int)((char*)this - buffer)); }
+};
+struct JC2 : JC1 {
+ JC2() { printf("JC2 : %d\n", (int)((char*)this - buffer)); }
+};
+struct JC4 : JC1, JC2 {
+ JC4() { printf("JC4 : %d\n", (int)((char*)this - buffer)); }
+};
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct JC4
+// CHECK-NEXT: 0 | struct JC1 (primary base)
+// CHECK-NEXT: 0 | (JC1 vftable pointer)
+// CHECK-NEXT: 4 | struct JC0 (base) (empty)
+// CHECK-NEXT: 8 | struct JC2 (base)
+// CHECK-NEXT: 8 | struct JC1 (primary base)
+// CHECK-NEXT: 8 | (JC1 vftable pointer)
+// CHECK-NEXT: 12 | struct JC0 (base) (empty)
+// CHECK-NEXT: | [sizeof=12, align=4
+// CHECK-NEXT: | nvsize=12, nvalign=4]
+// CHECK-x64: *** Dumping AST Record Layout
+// CHECK-x64: *** Dumping AST Record Layout
+// CHECK-x64: *** Dumping AST Record Layout
+// CHECK-x64: *** Dumping AST Record Layout
+// CHECK-x64-NEXT: 0 | struct JC4
+// CHECK-x64-NEXT: 0 | struct JC1 (primary base)
+// CHECK-x64-NEXT: 0 | (JC1 vftable pointer)
+// CHECK-x64-NEXT: 8 | struct JC0 (base) (empty)
+// CHECK-x64-NEXT: 16 | struct JC2 (base)
+// CHECK-x64-NEXT: 16 | struct JC1 (primary base)
+// CHECK-x64-NEXT: 16 | (JC1 vftable pointer)
+// CHECK-x64-NEXT: 24 | struct JC0 (base) (empty)
+// CHECK-x64-NEXT: | [sizeof=24, align=8
+// CHECK-x64-NEXT: | nvsize=24, nvalign=8]
+
int a[
sizeof(AT3) +
sizeof(BT3) +
sizeof(T3) +
sizeof(E) +
sizeof(F) +
+sizeof(JC4) +
0];
OpenPOWER on IntegriCloud