[Sema] Fix incorrect packed aligned structure layout

Handle attributes before checking the record layout (e.g. underalignment check
during `alignas` processing), as layout may be cached without taking into
account attributes that may affect it.

Differential Revision: https://reviews.llvm.org/D46439

llvm-svn: 332843
This commit is contained in:
Momchil Velikov 2018-05-21 14:28:43 +00:00
parent 86188d8a40
commit fe76b36ab1
2 changed files with 30 additions and 3 deletions

View File

@ -15594,6 +15594,10 @@ void Sema::ActOnFields(Scope *S, SourceLocation RecLoc, Decl *EnclosingDecl,
if (!Completed)
Record->completeDefinition();
// Handle attributes before checking the layout.
if (Attr)
ProcessDeclAttributeList(S, Record, Attr);
// We may have deferred checking for a deleted destructor. Check now.
if (CXXRecordDecl *CXXRecord = dyn_cast<CXXRecordDecl>(Record)) {
auto *Dtor = CXXRecord->getDestructor();
@ -15724,9 +15728,6 @@ void Sema::ActOnFields(Scope *S, SourceLocation RecLoc, Decl *EnclosingDecl,
CDecl->setIvarRBraceLoc(RBrac);
}
}
if (Attr)
ProcessDeclAttributeList(S, Record, Attr);
}
/// Determine whether the given integral value is representable within

View File

@ -0,0 +1,26 @@
// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only -fdump-record-layouts %s \
// RUN: | FileCheck %s
struct S {
char x;
int y;
} __attribute__((packed, aligned(8)));
struct alignas(8) T {
char x;
int y;
} __attribute__((packed));
S s;
T t;
// CHECK: 0 | struct T
// CHECK-NEXT: 0 | char x
// CHECK-NEXT: 1 | int y
// CHECK-NEXT: | [sizeof=8, dsize=8, align=8,
// CHECK-NEXT: | nvsize=8, nvalign=8]
// CHECK: 0 | struct S
// CHECK-NEXT: 0 | char x
// CHECK-NEXT: 1 | int y
// CHECK-NEXT: | [sizeof=8, dsize=8, align=8,
// CHECK-NETX: | nvsize=8, nvalign=8]