summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorWarren Hunt <whunt@google.com>2014-01-10 01:28:05 +0000
committerWarren Hunt <whunt@google.com>2014-01-10 01:28:05 +0000
commitf4518def33cc712fc71df9fb6f189df2a1316a59 (patch)
treeb2005186f642e7fdf680a75982e680c279659517 /clang/test
parentae6f9d4460a9f0a50957bd9a0ffe0e5f0cb2e3e1 (diff)
downloadbcm5719-llvm-f4518def33cc712fc71df9fb6f189df2a1316a59.tar.gz
bcm5719-llvm-f4518def33cc712fc71df9fb6f189df2a1316a59.zip
[ms-abi] Handle __declspec(align) on bitfields "properly"
__declspec(align), when applied to bitfields affects their perferred alignment instead of their required alignment. We don't know why. Also, #pragma pack(n) turns packing *off* if n is greater than the pointer size. This is now observable because of the impact of declspec(align) on bitfields. llvm-svn: 198907
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/Layout/ms-x86-pack-and-align.cpp117
1 files changed, 116 insertions, 1 deletions
diff --git a/clang/test/Layout/ms-x86-pack-and-align.cpp b/clang/test/Layout/ms-x86-pack-and-align.cpp
index b9d286211e4..fba485f5a22 100644
--- a/clang/test/Layout/ms-x86-pack-and-align.cpp
+++ b/clang/test/Layout/ms-x86-pack-and-align.cpp
@@ -183,9 +183,124 @@ struct CA2 : public CA1, public CA0 {
// CHECK-C64-NEXT: | [sizeof=17, align=1
// CHECK-C64-NEXT: | nvsize=17, nvalign=1]
+#pragma pack(16)
+struct YA {
+ __declspec(align(32)) char : 1;
+};
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct YA (empty)
+// CHECK-NEXT: 0 | char
+// CHECK-NEXT: | [sizeof=32, align=32
+// CHECK-NEXT: | nvsize=32, nvalign=32]
+// 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 YA (empty)
+// CHECK-X64-NEXT: 0 | char
+// CHECK-X64-NEXT: | [sizeof=32, align=32
+// CHECK-X64-NEXT: | nvsize=32, nvalign=32]
+
+#pragma pack(1)
+struct YB {
+ char a;
+ YA b;
+};
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct YB
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 1 | struct YA b (empty)
+// CHECK-NEXT: 1 | char
+// CHECK: | [sizeof=33, align=1
+// CHECK-NEXT: | nvsize=33, nvalign=1]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct YB
+// CHECK-X64-NEXT: 0 | char a
+// CHECK-X64-NEXT: 1 | struct YA b (empty)
+// CHECK-X64-NEXT: 1 | char
+// CHECK-X64: | [sizeof=33, align=1
+// CHECK-X64-NEXT: | nvsize=33, nvalign=1]
+
+#pragma pack(8)
+struct YC {
+ __declspec(align(32)) char : 1;
+};
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct YC (empty)
+// CHECK-NEXT: 0 | char
+// CHECK-NEXT: | [sizeof=32, align=32
+// CHECK-NEXT: | nvsize=32, nvalign=32]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct YC (empty)
+// CHECK-X64-NEXT: 0 | char
+// CHECK-X64-NEXT: | [sizeof=8, align=8
+// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
+
+#pragma pack(1)
+struct YD {
+ char a;
+ YC b;
+};
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct YD
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 1 | struct YC b (empty)
+// CHECK-NEXT: 1 | char
+// CHECK: | [sizeof=33, align=1
+// CHECK-NEXT: | nvsize=33, nvalign=1]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct YD
+// CHECK-X64-NEXT: 0 | char a
+// CHECK-X64-NEXT: 1 | struct YC b (empty)
+// CHECK-X64-NEXT: 1 | char
+// CHECK-X64: | [sizeof=9, align=1
+// CHECK-X64-NEXT: | nvsize=9, nvalign=1]
+
+#pragma pack(4)
+struct YE {
+ __declspec(align(32)) char : 1;
+};
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct YE (empty)
+// CHECK-NEXT: 0 | char
+// CHECK-NEXT: | [sizeof=4, align=4
+// CHECK-NEXT: | nvsize=4, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct YE (empty)
+// CHECK-X64-NEXT: 0 | char
+// CHECK-X64-NEXT: | [sizeof=4, align=4
+// CHECK-X64-NEXT: | nvsize=4, nvalign=4]
+
+#pragma pack(1)
+struct YF {
+ char a;
+ YE b;
+};
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT: 0 | struct YF
+// CHECK-NEXT: 0 | char a
+// CHECK-NEXT: 1 | struct YE b (empty)
+// CHECK-NEXT: 1 | char
+// CHECK: | [sizeof=5, align=1
+// CHECK-NEXT: | nvsize=5, nvalign=1]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT: 0 | struct YF
+// CHECK-X64-NEXT: 0 | char a
+// CHECK-X64-NEXT: 1 | struct YE b (empty)
+// CHECK-X64-NEXT: 1 | char
+// CHECK-X64: | [sizeof=5, align=1
+// CHECK-X64-NEXT: | nvsize=5, nvalign=1]
+
int a[
sizeof(X)+
sizeof(Y)+
sizeof(Z)+
sizeof(C1)+
-sizeof(CA2)];
+sizeof(CA2)+
+sizeof(YA)+
+sizeof(YB)+
+sizeof(YC)+
+sizeof(YD)+
+sizeof(YE)+
+sizeof(YF)+
+0];
OpenPOWER on IntegriCloud