diff options
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 4 | ||||
-rw-r--r-- | clang/test/Layout/ms-x86-pack-and-align.cpp | 29 |
2 files changed, 32 insertions, 1 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 7a309603b41..6545d3b351e 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -1707,8 +1707,10 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const { if (unsigned AttrAlign = Typedef->getMaxAlignment()) { Align = AttrAlign; AlignIsRequired = true; - } else + } else { Align = Info.Align; + AlignIsRequired = Info.AlignIsRequired; + } Width = Info.Width; break; } diff --git a/clang/test/Layout/ms-x86-pack-and-align.cpp b/clang/test/Layout/ms-x86-pack-and-align.cpp index 73dcc7f57fd..e2f03d782e5 100644 --- a/clang/test/Layout/ms-x86-pack-and-align.cpp +++ b/clang/test/Layout/ms-x86-pack-and-align.cpp @@ -684,6 +684,34 @@ struct PC { // CHECK-X64-NEXT: | [sizeof=16, align=8 // CHECK-X64-NEXT: | nvsize=12, nvalign=8] +typedef PB PD; + +#pragma pack(push, 1) +struct PE { + char a; + PD x; +}; +#pragma pack(pop) + +// CHECK: *** Dumping AST Record Layout +// CHECK: 0 | struct PE +// CHECK-NEXT: 0 | char a +// CHECK-NEXT: 8 | struct PA x +// CHECK-NEXT: 8 | int c +// CHECK-NEXT: | [sizeof=4, align=4 +// CHECK-NEXT: | nvsize=4, nvalign=4] +// CHECK-NEXT: | [sizeof=16, align=8 +// CHECK-NEXT: | nvsize=12, nvalign=8] +// CHECK-X64: *** Dumping AST Record Layout +// CHECK-X64: 0 | struct PE +// CHECK-X64-NEXT: 0 | char a +// CHECK-X64-NEXT: 8 | struct PA x +// CHECK-X64-NEXT: 8 | int c +// CHECK-X64-NEXT: | [sizeof=4, align=4 +// CHECK-X64-NEXT: | nvsize=4, nvalign=4] +// CHECK-X64-NEXT: | [sizeof=16, align=8 +// CHECK-X64-NEXT: | nvsize=12, nvalign=8] + typedef int __declspec(align(2)) QA; #pragma pack(push, 1) struct QB { @@ -768,6 +796,7 @@ sizeof(RE)+ sizeof(ND)+ sizeof(OD)+ sizeof(PC)+ +sizeof(PE)+ sizeof(QB)+ sizeof(QC)+ sizeof(QD)+ |