diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index a7cee3b7ba2b0..e877f903b34c6 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -1627,28 +1627,22 @@ const llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const { CharUnits ASTContext::getDeclAlign(const Decl *D, bool ForAlignof) const { unsigned Align = Target->getCharWidth(); - bool UseAlignAttrOnly = false; - if (unsigned AlignFromAttr = D->getMaxAlignment()) { + const unsigned AlignFromAttr = D->getMaxAlignment(); + if (AlignFromAttr) Align = AlignFromAttr; - // __attribute__((aligned)) can increase or decrease alignment - // *except* on a struct or struct member, where it only increases - // alignment unless 'packed' is also specified. - // - // It is an error for alignas to decrease alignment, so we can - // ignore that possibility; Sema should diagnose it. - if (isa(D)) { - UseAlignAttrOnly = D->hasAttr() || - cast(D)->getParent()->hasAttr(); - } else { - UseAlignAttrOnly = true; - } - } - else if (isa(D)) - UseAlignAttrOnly = - D->hasAttr() || - cast(D)->getParent()->hasAttr(); - + // __attribute__((aligned)) can increase or decrease alignment + // *except* on a struct or struct member, where it only increases + // alignment unless 'packed' is also specified. + // + // It is an error for alignas to decrease alignment, so we can + // ignore that possibility; Sema should diagnose it. + bool UseAlignAttrOnly; + if (const FieldDecl *FD = dyn_cast(D)) + UseAlignAttrOnly = + FD->hasAttr() || FD->getParent()->hasAttr(); + else + UseAlignAttrOnly = AlignFromAttr != 0; // If we're using the align attribute only, just ignore everything // else about the declaration and its type. if (UseAlignAttrOnly) {