xref: /llvm-project/clang/test/Layout/ms-aligned-array.c (revision 7c1d9b15eee3a34678addab2bab66f3020ac0753)
1*7c1d9b15SFangrui Song // RUN: %clang_cc1 -fno-rtti -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
28da5b908SReid Kleckner // RUN:            | FileCheck %s -check-prefix CHECK
38da5b908SReid Kleckner 
48da5b908SReid Kleckner // Before PR45420, we would only find the alignment on this record. Afterwards,
58da5b908SReid Kleckner // we can see the alignment on the typedef through the array type.
68da5b908SReid Kleckner // FIXME: What about other type sugar, like _Atomic? This would only matter in a
78da5b908SReid Kleckner // packed struct context.
88da5b908SReid Kleckner struct __declspec(align(16)) AlignedStruct { int x; };
9adaf62ceSAkira Hatanaka struct Struct2 {
10adaf62ceSAkira Hatanaka   char c[16];
11adaf62ceSAkira Hatanaka };
12adaf62ceSAkira Hatanaka typedef struct Struct2 __declspec(align(16)) AlignedStruct2;
138da5b908SReid Kleckner 
148da5b908SReid Kleckner #define CHECK_SIZE(X, Align) \
158da5b908SReid Kleckner   _Static_assert(__alignof(struct X) == Align, "should be aligned");
168da5b908SReid Kleckner 
178da5b908SReid Kleckner #pragma pack(push, 2)
188da5b908SReid Kleckner 
198da5b908SReid Kleckner struct A {
208da5b908SReid Kleckner   struct AlignedStruct a[1];
218da5b908SReid Kleckner };
228da5b908SReid Kleckner CHECK_SIZE(A, 16);
238da5b908SReid Kleckner 
248da5b908SReid Kleckner struct B {
258da5b908SReid Kleckner   char b;
26adaf62ceSAkira Hatanaka   AlignedStruct2 a[1];
278da5b908SReid Kleckner };
288da5b908SReid Kleckner CHECK_SIZE(B, 16);
298da5b908SReid Kleckner 
308da5b908SReid Kleckner struct C {
318da5b908SReid Kleckner   char b;
32adaf62ceSAkira Hatanaka   AlignedStruct2 a[];
338da5b908SReid Kleckner };
348da5b908SReid Kleckner CHECK_SIZE(C, 16);
358da5b908SReid Kleckner 
368da5b908SReid Kleckner // CHECK: *** Dumping AST Record Layout
378da5b908SReid Kleckner // CHECK-NEXT:          0 | struct AlignedStruct
388da5b908SReid Kleckner // CHECK-NEXT:          0 |   int x
398da5b908SReid Kleckner // CHECK-NEXT:            | [sizeof=16, align=16]
408da5b908SReid Kleckner // CHECK: *** Dumping AST Record Layout
418da5b908SReid Kleckner // CHECK-NEXT:          0 | struct A
428da5b908SReid Kleckner // CHECK-NEXT:          0 |   struct AlignedStruct[1] a
438da5b908SReid Kleckner // CHECK-NEXT:            | [sizeof=16, align=16]
448da5b908SReid Kleckner // CHECK: *** Dumping AST Record Layout
45adaf62ceSAkira Hatanaka // CHECK-NEXT:          0 | struct Struct2
46adaf62ceSAkira Hatanaka // CHECK-NEXT:          0 |   char[16] c
47adaf62ceSAkira Hatanaka // CHECK-NEXT:            | [sizeof=16, align=1]
48adaf62ceSAkira Hatanaka // CHECK: *** Dumping AST Record Layout
498da5b908SReid Kleckner // CHECK-NEXT:          0 | struct B
508da5b908SReid Kleckner // CHECK-NEXT:          0 |   char b
51adaf62ceSAkira Hatanaka // CHECK-NEXT:         16 |   AlignedStruct2[1] a
528da5b908SReid Kleckner // CHECK-NEXT:            | [sizeof=32, align=16]
538da5b908SReid Kleckner // CHECK: *** Dumping AST Record Layout
548da5b908SReid Kleckner // CHECK-NEXT:          0 | struct C
558da5b908SReid Kleckner // CHECK-NEXT:          0 |   char b
56adaf62ceSAkira Hatanaka // CHECK-NEXT:         16 |   AlignedStruct2[] a
578da5b908SReid Kleckner // CHECK-NEXT:            | [sizeof=16, align=16]
588da5b908SReid Kleckner 
598da5b908SReid Kleckner #pragma pack(pop)
608da5b908SReid Kleckner 
61