diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2014-02-12 20:36:10 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2014-02-12 20:36:10 +0000 |
| commit | abecae741cb70a3047479eaa77ee55f19dcecbf3 (patch) | |
| tree | 80d656d4abcfcdd265473680d4c70e9304e8cf5f /clang/lib | |
| parent | 7199fd532c5155be153605e49c92ff8a804d01c7 (diff) | |
| download | bcm5719-llvm-abecae741cb70a3047479eaa77ee55f19dcecbf3.tar.gz bcm5719-llvm-abecae741cb70a3047479eaa77ee55f19dcecbf3.zip | |
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
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 14 |
1 files changed, 6 insertions, 8 deletions
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, |

