diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2012-11-30 23:09:29 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2012-11-30 23:09:29 +0000 |
commit | d87de7bdbc25dd84ae3dbefffda4539c443000d2 (patch) | |
tree | 92ed861701bee1b15db0bd539a29ce13057c9404 | |
parent | 4565e487531c7bf6d348dbe9f5529784966fc7ae (diff) |
Make -Wtautological-constant-out-of-range-compare behave sanely for enums with a signed fixed type.
<rdar://problem/12780159>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169051 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaChecking.cpp | 7 | ||||
-rw-r--r-- | test/SemaCXX/compare.cpp | 9 |
2 files changed, 11 insertions, 5 deletions
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 33dcb3a6cb..235383fdd1 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -4346,7 +4346,6 @@ static void DiagnoseOutOfRangeComparison(Sema &S, BinaryOperator *E, && "comparison with non-integer type"); bool ConstantSigned = ConstantT->isSignedIntegerType(); - bool OtherSigned = OtherT->isSignedIntegerType(); bool CommonSigned = CommonT->isSignedIntegerType(); bool EqualityOnly = false; @@ -4358,7 +4357,7 @@ static void DiagnoseOutOfRangeComparison(Sema &S, BinaryOperator *E, if (CommonSigned) { // The common type is signed, therefore no signed to unsigned conversion. - if (OtherSigned) { + if (!OtherRange.NonNegative) { // Check that the constant is representable in type OtherT. if (ConstantSigned) { if (OtherWidth >= Value.getMinSignedBits()) @@ -4379,10 +4378,10 @@ static void DiagnoseOutOfRangeComparison(Sema &S, BinaryOperator *E, } } } else { // !CommonSigned - if (!OtherSigned) { + if (OtherRange.NonNegative) { if (OtherWidth >= Value.getActiveBits()) return; - } else if (OtherSigned && !ConstantSigned) { + } else if (!OtherRange.NonNegative && !ConstantSigned) { // Check to see if the constant is representable in OtherT. if (OtherWidth > Value.getActiveBits()) return; diff --git a/test/SemaCXX/compare.cpp b/test/SemaCXX/compare.cpp index c76efe92ba..5771912590 100644 --- a/test/SemaCXX/compare.cpp +++ b/test/SemaCXX/compare.cpp @@ -1,7 +1,7 @@ // Force x86-64 because some of our heuristics are actually based // on integer sizes. -// RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -pedantic -verify -Wsign-compare %s +// RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -pedantic -verify -Wsign-compare -std=c++11 %s int test0(long a, unsigned long b) { enum EnumA {A}; @@ -348,3 +348,10 @@ void test8(int x) { (void)((E)x == 1); (void)((E)x == -1); } + +void test9(int x) { + enum E : int { + Positive = 1 + }; + (void)((E)x == 1); +} |