summaryrefslogtreecommitdiffstats
path: root/clang/test/Layout
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-01-31 22:28:50 +0000
committerReid Kleckner <reid@kleckner.net>2014-01-31 22:28:50 +0000
commitbd63b3385429f4b5266048a64429cf81a64914b6 (patch)
tree7e04e4e23d54a51222c47e534eeaba17e4987b89 /clang/test/Layout
parent6d7a5637f12323c5a692a31d49dd36043a372853 (diff)
downloadbcm5719-llvm-bd63b3385429f4b5266048a64429cf81a64914b6.tar.gz
bcm5719-llvm-bd63b3385429f4b5266048a64429cf81a64914b6.zip
[ms-cxxabi] Raise aggregate memptr alignment to 8 for x86_32
With this change, we give different results for __alignof than MSVC, but our record layout is compatible. Some data member pointers also now have a size that is not a multiple of their alignment. Fixes PR18618. Reviewers: majnemer Differential Revision: http://llvm-reviews.chandlerc.com/D2669 llvm-svn: 200585
Diffstat (limited to 'clang/test/Layout')
-rw-r--r--clang/test/Layout/ms-x86-member-pointers.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/clang/test/Layout/ms-x86-member-pointers.cpp b/clang/test/Layout/ms-x86-member-pointers.cpp
new file mode 100644
index 00000000000..89dd211a351
--- /dev/null
+++ b/clang/test/Layout/ms-x86-member-pointers.cpp
@@ -0,0 +1,80 @@
+// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fms-extensions -fsyntax-only %s 2>&1 | FileCheck %s
+
+struct __single_inheritance S;
+struct __multiple_inheritance M;
+struct __virtual_inheritance V;
+struct U;
+
+struct SD { char a; int S::*mp; };
+struct MD { char a; int M::*mp; };
+struct VD { char a; int V::*mp; };
+struct UD { char a; int U::*mp; };
+struct SF { char a; int (S::*mp)(); };
+struct MF { char a; int (M::*mp)(); };
+struct VF { char a; int (V::*mp)(); };
+struct UF { char a; int (U::*mp)(); };
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct SD
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 4 | int struct S::* mp
+// CHECK-NEXT: | [sizeof=8, align=4
+// CHECK-NEXT: | nvsize=8, nvalign=4]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct MD
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 4 | int struct M::* mp
+// CHECK-NEXT: | [sizeof=8, align=4
+// CHECK-NEXT: | nvsize=8, nvalign=4]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct VD
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 8 | int struct V::* mp
+// CHECK-NEXT: | [sizeof=16, align=8
+// CHECK-NEXT: | nvsize=16, nvalign=8]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct UD
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 8 | int struct U::* mp
+// CHECK-NEXT: | [sizeof=24, align=8
+// CHECK-NEXT: | nvsize=24, nvalign=8]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct SF
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 4 | int (struct S::*)(void) __attribute__((thiscall)) mp
+// CHECK-NEXT: | [sizeof=8, align=4
+// CHECK-NEXT: | nvsize=8, nvalign=4]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct MF
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 8 | int (struct M::*)(void) __attribute__((thiscall)) mp
+// CHECK-NEXT: | [sizeof=16, align=8
+// CHECK-NEXT: | nvsize=16, nvalign=8]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct VF
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 8 | int (struct V::*)(void) __attribute__((thiscall)) mp
+// CHECK-NEXT: | [sizeof=24, align=8
+// CHECK-NEXT: | nvsize=24, nvalign=8]
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct UF
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 8 | int (struct U::*)(void) __attribute__((thiscall)) mp
+// CHECK-NEXT: | [sizeof=24, align=8
+// CHECK-NEXT: | nvsize=24, nvalign=8]
+
+char a[sizeof(SD) +
+ sizeof(MD) +
+ sizeof(VD) +
+ sizeof(UD) +
+ sizeof(SF) +
+ sizeof(MF) +
+ sizeof(VF) +
+ sizeof(UF)];
OpenPOWER on IntegriCloud