| // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \ |
| // RUN: | FileCheck %s -check-prefix CHECK |
| |
| // Before PR45420, we would only find the alignment on this record. Afterwards, |
| // we can see the alignment on the typedef through the array type. |
| // FIXME: What about other type sugar, like _Atomic? This would only matter in a |
| // packed struct context. |
| struct __declspec(align(16)) AlignedStruct { int x; }; |
| typedef int __declspec(align(16)) AlignedInt; |
| |
| #define CHECK_SIZE(X, Align) \ |
| _Static_assert(__alignof(struct X) == Align, "should be aligned"); |
| |
| #pragma pack(push, 2) |
| |
| struct A { |
| struct AlignedStruct a[1]; |
| }; |
| CHECK_SIZE(A, 16); |
| |
| struct B { |
| char b; |
| AlignedInt a[1]; |
| }; |
| CHECK_SIZE(B, 16); |
| |
| struct C { |
| char b; |
| AlignedInt a[]; |
| }; |
| CHECK_SIZE(C, 16); |
| |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct AlignedStruct |
| // CHECK-NEXT: 0 | int x |
| // CHECK-NEXT: | [sizeof=16, align=16] |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct A |
| // CHECK-NEXT: 0 | struct AlignedStruct [1] a |
| // CHECK-NEXT: | [sizeof=16, align=16] |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct B |
| // CHECK-NEXT: 0 | char b |
| // CHECK-NEXT: 16 | AlignedInt [1] a |
| // CHECK-NEXT: | [sizeof=32, align=16] |
| // CHECK: *** Dumping AST Record Layout |
| // CHECK-NEXT: 0 | struct C |
| // CHECK-NEXT: 0 | char b |
| // CHECK-NEXT: 16 | AlignedInt [] a |
| // CHECK-NEXT: | [sizeof=16, align=16] |
| |
| #pragma pack(pop) |
| |