diff options
author | Richard Trieu <rtrieu@google.com> | 2012-11-16 01:32:40 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2012-11-16 01:32:40 +0000 |
commit | 8f50b24c8b17368f68c2e71240d487dde53f6da8 (patch) | |
tree | 84e635c1abb8d399a11e512e4ebf8eee7a484ad3 /lib/Sema/SemaChecking.cpp | |
parent | 0bbf1c668e8cb1a3e5b1385c2fd5cd6c73f481c0 (diff) |
Take into account the zero sign bit for positive numbers when computing the bit
width of an enum with negative values in IntRange. Include a test for
-Wtautological-constant-out-of-range-compare where this had manifested.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@168126 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaChecking.cpp')
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 05fa2a0663..8e0a983d12 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -3922,7 +3922,11 @@ struct IntRange { unsigned NumPositive = Enum->getNumPositiveBits(); unsigned NumNegative = Enum->getNumNegativeBits(); - return IntRange(std::max(NumPositive, NumNegative), NumNegative == 0); + if (NumNegative == 0) + return IntRange(NumPositive, true/*NonNegative*/); + else + return IntRange(std::max(NumPositive + 1, NumNegative), + false/*NonNegative*/); } const BuiltinType *BT = cast<BuiltinType>(T); |