From: David Majnemer Date: Mon, 4 Aug 2014 05:11:01 +0000 (+0000) Subject: AST: Propagate 'AlignIsRequired' though many levels of typedefs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9160039db59de6cfcd9ee377404c09e9ab46c63f;p=clang AST: Propagate 'AlignIsRequired' though many levels of typedefs A typedef of a typedef should have AlignIsRequired if *either* typedef has an AlignAttr attached to it. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@214698 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 7a309603b4..6545d3b351 100644 --- a/lib/AST/ASTContext.cpp +++ b/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/test/Layout/ms-x86-pack-and-align.cpp b/test/Layout/ms-x86-pack-and-align.cpp index 73dcc7f57f..e2f03d782e 100644 --- a/test/Layout/ms-x86-pack-and-align.cpp +++ b/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)+