diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 92d964d6603d1b..fae1ade80ca978 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -372,15 +372,6 @@ class Sema final { QualType ResultTy, ArrayRef Args); - /// The maximum alignment, same as in llvm::Value. We duplicate them here - /// because that allows us not to duplicate the constants in clang code, - /// which we must to since we can't directly use the llvm constants. - /// - /// This is the greatest alignment value supported by load, store, and alloca - /// instructions, and global values. - static const unsigned MaxAlignmentExponent = 29; - static const unsigned MaximumAlignment = 1u << MaxAlignmentExponent; - public: typedef OpaquePtr DeclGroupPtrTy; typedef OpaquePtr TemplateTy; diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 1539f3375c41b3..1f361569e09dea 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -5373,9 +5373,11 @@ bool Sema::SemaBuiltinAssumeAligned(CallExpr *TheCall) { return Diag(TheCall->getBeginLoc(), diag::err_alignment_not_power_of_two) << Arg->getSourceRange(); - if (Result > Sema::MaximumAlignment) + // Alignment calculations can wrap around if it's greater than 2**29. + unsigned MaximumAlignment = 536870912; + if (Result > MaximumAlignment) Diag(TheCall->getBeginLoc(), diag::warn_assume_aligned_too_great) - << Arg->getSourceRange() << Sema::MaximumAlignment; + << Arg->getSourceRange() << MaximumAlignment; } if (NumArgs > 2) { diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index b404b45fec599c..8aff975b8f2d91 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -3810,9 +3810,13 @@ void Sema::AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, } } - if (AlignVal > Sema::MaximumAlignment) { + // Alignment calculations can wrap around if it's greater than 2**28. + unsigned MaxValidAlignment = + Context.getTargetInfo().getTriple().isOSBinFormatCOFF() ? 8192 + : 268435456; + if (AlignVal > MaxValidAlignment) { Diag(AttrLoc, diag::err_attribute_aligned_too_great) - << Sema::MaximumAlignment << E->getSourceRange(); + << MaxValidAlignment << E->getSourceRange(); return; }