diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 4 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 14 | ||||
| -rw-r--r-- | clang/test/Sema/attr-aligned.c | 1 | 
3 files changed, 9 insertions, 10 deletions
| diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 93d5948ce8f..b570639af01 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -1982,8 +1982,8 @@ def error_cannot_find_suitable_accessor : Error<  def err_attribute_aligned_not_power_of_two : Error<    "requested alignment is not a power of 2">; -def err_attribute_aligned_greater_than_8192 : Error< -  "requested alignment must be 8192 bytes or smaller">; +def err_attribute_aligned_too_great : Error< +  "requested alignment must be %0 bytes or smaller">;  def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning<    "%0 redeclared without %1 attribute: previous %1 ignored">;  def warn_attribute_ignored : Warning<"%0 attribute ignored">, diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 1bc34aa85f9..ccfb7bc0ab7 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -2814,14 +2814,12 @@ void Sema::AddAlignedAttr(SourceRange AttrRange, Decl *D, Expr *E,      return;    } -  if (TmpAttr.isDeclspec()) { -    // We've already verified it's a power of 2, now let's make sure it's -    // 8192 or less. -    if (Alignment.getZExtValue() > 8192) { -      Diag(AttrLoc, diag::err_attribute_aligned_greater_than_8192) -        << E->getSourceRange(); -      return; -    } +  // Alignment calculations can wrap around if it's greater than 2**28. +  unsigned MaxValidAlignment = TmpAttr.isDeclspec() ? 8192 : 268435456; +  if (Alignment.getZExtValue() > MaxValidAlignment) { +    Diag(AttrLoc, diag::err_attribute_aligned_too_great) << MaxValidAlignment +                                                         << E->getSourceRange(); +    return;    }    AlignedAttr *AA = ::new (Context) AlignedAttr(AttrRange, Context, true, diff --git a/clang/test/Sema/attr-aligned.c b/clang/test/Sema/attr-aligned.c index c094ff172dd..11d9e9eea35 100644 --- a/clang/test/Sema/attr-aligned.c +++ b/clang/test/Sema/attr-aligned.c @@ -1,6 +1,7 @@  // RUN: %clang_cc1 -triple i386-apple-darwin9 -fsyntax-only -verify %s  int x __attribute__((aligned(3))); // expected-error {{requested alignment is not a power of 2}} +int y __attribute__((aligned(1 << 29))); // expected-error {{requested alignment must be 268435456 bytes or smaller}}  // PR3254  short g0[3] __attribute__((aligned)); | 

