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