forked from OSchip/llvm-project
Teach __alignof__ to look through arrays before performing the
preferred-alignment transformations. Corrects alignof(T[]) to return alignof(T) in all cases, as required by relevant standards. llvm-svn: 210609
This commit is contained in:
parent
f6d7030f0f
commit
d7e1fe40e1
|
@ -1328,15 +1328,6 @@ CharUnits ASTContext::getDeclAlign(const Decl *D, bool ForAlignof) const {
|
|||
MinWidth <= getTypeSize(cast<ConstantArrayType>(arrayType)))
|
||||
Align = std::max(Align, Target->getLargeArrayAlign());
|
||||
}
|
||||
|
||||
// Keep track of extra alignment requirements on the array itself, then
|
||||
// work with the element type.
|
||||
//
|
||||
// FIXME: Computing the preferred type alignment for the array element
|
||||
// type should not be necessary, but getPreferredTypeAlign returns the
|
||||
// wrong thing in some cases (such as 'long long[]' on x86_64).
|
||||
Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr()));
|
||||
T = BaseT;
|
||||
}
|
||||
Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr()));
|
||||
if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
|
||||
|
@ -1788,6 +1779,7 @@ unsigned ASTContext::getPreferredTypeAlign(const Type *T) const {
|
|||
const TypedefType *TT = T->getAs<TypedefType>();
|
||||
|
||||
// Double and long long should be naturally aligned if possible.
|
||||
T = T->getBaseElementTypeUnsafe();
|
||||
if (const ComplexType *CT = T->getAs<ComplexType>())
|
||||
T = CT->getElementType().getTypePtr();
|
||||
if (T->isSpecificBuiltinType(BuiltinType::Double) ||
|
||||
|
|
|
@ -23,6 +23,10 @@ struct __attribute__((packed)) {unsigned int a;} g4;
|
|||
short chk1[__alignof__(g4) == 1 ? 1 : -1];
|
||||
short chk2[__alignof__(g4.a) == 1 ? 1 : -1];
|
||||
|
||||
double g6[3];
|
||||
short chk1[__alignof__(g6) == 8 ? 1 : -1];
|
||||
short chk2[__alignof__(double[3]) == 8 ? 1 : -1];
|
||||
|
||||
|
||||
// PR5637
|
||||
|
||||
|
|
Loading…
Reference in New Issue