Sema: Restrict alignment to 2**28.
Allowing alignment past this point causes wrap around within clang. N.B. GCC has the same restriction. llvm-svn: 201254
This commit is contained in:
parent
7199fd532c
commit
abecae741c
|
@ -1982,8 +1982,8 @@ def error_cannot_find_suitable_accessor : Error<
|
||||||
|
|
||||||
def err_attribute_aligned_not_power_of_two : Error<
|
def err_attribute_aligned_not_power_of_two : Error<
|
||||||
"requested alignment is not a power of 2">;
|
"requested alignment is not a power of 2">;
|
||||||
def err_attribute_aligned_greater_than_8192 : Error<
|
def err_attribute_aligned_too_great : Error<
|
||||||
"requested alignment must be 8192 bytes or smaller">;
|
"requested alignment must be %0 bytes or smaller">;
|
||||||
def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning<
|
def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning<
|
||||||
"%0 redeclared without %1 attribute: previous %1 ignored">;
|
"%0 redeclared without %1 attribute: previous %1 ignored">;
|
||||||
def warn_attribute_ignored : Warning<"%0 attribute ignored">,
|
def warn_attribute_ignored : Warning<"%0 attribute ignored">,
|
||||||
|
|
|
@ -2814,14 +2814,12 @@ void Sema::AddAlignedAttr(SourceRange AttrRange, Decl *D, Expr *E,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TmpAttr.isDeclspec()) {
|
// Alignment calculations can wrap around if it's greater than 2**28.
|
||||||
// We've already verified it's a power of 2, now let's make sure it's
|
unsigned MaxValidAlignment = TmpAttr.isDeclspec() ? 8192 : 268435456;
|
||||||
// 8192 or less.
|
if (Alignment.getZExtValue() > MaxValidAlignment) {
|
||||||
if (Alignment.getZExtValue() > 8192) {
|
Diag(AttrLoc, diag::err_attribute_aligned_too_great) << MaxValidAlignment
|
||||||
Diag(AttrLoc, diag::err_attribute_aligned_greater_than_8192)
|
<< E->getSourceRange();
|
||||||
<< E->getSourceRange();
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AlignedAttr *AA = ::new (Context) AlignedAttr(AttrRange, Context, true,
|
AlignedAttr *AA = ::new (Context) AlignedAttr(AttrRange, Context, true,
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// RUN: %clang_cc1 -triple i386-apple-darwin9 -fsyntax-only -verify %s
|
// 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 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
|
// PR3254
|
||||||
short g0[3] __attribute__((aligned));
|
short g0[3] __attribute__((aligned));
|
||||||
|
|
Loading…
Reference in New Issue