зеркало из https://github.com/microsoft/clang-1.git
Enhance -Wtautological-constant-out-of-range-compare to include the name of the enum constant.
This is QoI. Fixes <rdar://problem/13076064>. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177190 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
2f13eb116e
Коммит
7adf3a9f84
|
@ -4495,9 +4495,22 @@ static void DiagnoseOutOfRangeComparison(Sema &S, BinaryOperator *E,
|
|||
else // op == BO_GT || op == BO_GE
|
||||
IsTrue = PositiveConstant;
|
||||
}
|
||||
SmallString<16> PrettySourceValue(Value.toString(10));
|
||||
|
||||
// If this is a comparison to an enum constant, include that
|
||||
// constant in the diagnostic.
|
||||
const EnumConstantDecl *ED = 0;
|
||||
if (const DeclRefExpr *DR = dyn_cast<DeclRefExpr>(Constant))
|
||||
ED = dyn_cast<EnumConstantDecl>(DR->getDecl());
|
||||
|
||||
SmallString<64> PrettySourceValue;
|
||||
llvm::raw_svector_ostream OS(PrettySourceValue);
|
||||
if (ED)
|
||||
OS << '\'' << ED->getName() << "' (" << Value << ")";
|
||||
else
|
||||
OS << Value;
|
||||
|
||||
S.Diag(E->getOperatorLoc(), diag::warn_out_of_range_compare)
|
||||
<< PrettySourceValue << OtherT << IsTrue
|
||||
<< OS.str() << OtherT << IsTrue
|
||||
<< E->getLHS()->getSourceRange() << E->getRHS()->getSourceRange();
|
||||
}
|
||||
|
||||
|
|
|
@ -93,8 +93,8 @@ int ints(long a, unsigned long b) {
|
|||
// (C,b)
|
||||
(C == (unsigned long) b) +
|
||||
(C == (unsigned int) b) +
|
||||
(C == (unsigned short) b) + // expected-warning {{comparison of constant 65536 with expression of type 'unsigned short' is always false}}
|
||||
(C == (unsigned char) b) + // expected-warning {{comparison of constant 65536 with expression of type 'unsigned char' is always false}}
|
||||
(C == (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}}
|
||||
(C == (unsigned char) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}}
|
||||
((long) C == b) +
|
||||
((int) C == b) +
|
||||
((short) C == b) +
|
||||
|
@ -105,8 +105,8 @@ int ints(long a, unsigned long b) {
|
|||
((signed char) C == (unsigned char) b) +
|
||||
(C < (unsigned long) b) +
|
||||
(C < (unsigned int) b) +
|
||||
(C < (unsigned short) b) + // expected-warning {{comparison of constant 65536 with expression of type 'unsigned short' is always false}}
|
||||
(C < (unsigned char) b) + // expected-warning {{comparison of constant 65536 with expression of type 'unsigned char' is always false}}
|
||||
(C < (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}}
|
||||
(C < (unsigned char) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}}
|
||||
((long) C < b) +
|
||||
((int) C < b) +
|
||||
((short) C < b) +
|
||||
|
@ -123,8 +123,8 @@ int ints(long a, unsigned long b) {
|
|||
(a == (unsigned char) C) +
|
||||
((long) a == C) +
|
||||
((int) a == C) +
|
||||
((short) a == C) + // expected-warning {{comparison of constant 65536 with expression of type 'short' is always false}}
|
||||
((signed char) a == C) + // expected-warning {{comparison of constant 65536 with expression of type 'signed char' is always false}}
|
||||
((short) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always false}}
|
||||
((signed char) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always false}}
|
||||
((long) a == (unsigned long) C) +
|
||||
((int) a == (unsigned int) C) +
|
||||
((short) a == (unsigned short) C) +
|
||||
|
@ -135,8 +135,8 @@ int ints(long a, unsigned long b) {
|
|||
(a < (unsigned char) C) +
|
||||
((long) a < C) +
|
||||
((int) a < C) +
|
||||
((short) a < C) + // expected-warning {{comparison of constant 65536 with expression of type 'short' is always true}}
|
||||
((signed char) a < C) + // expected-warning {{comparison of constant 65536 with expression of type 'signed char' is always true}}
|
||||
((short) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always true}}
|
||||
((signed char) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always true}}
|
||||
((long) a < (unsigned long) C) + // expected-warning {{comparison of integers of different signs}}
|
||||
((int) a < (unsigned int) C) + // expected-warning {{comparison of integers of different signs}}
|
||||
((short) a < (unsigned short) C) +
|
||||
|
|
|
@ -89,8 +89,8 @@ int test0(long a, unsigned long b) {
|
|||
// (C,b)
|
||||
(C == (unsigned long) b) +
|
||||
(C == (unsigned int) b) +
|
||||
(C == (unsigned short) b) + // expected-warning {{comparison of constant 65536 with expression of type 'unsigned short' is always false}}
|
||||
(C == (unsigned char) b) + // expected-warning {{comparison of constant 65536 with expression of type 'unsigned char' is always false}}
|
||||
(C == (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}}
|
||||
(C == (unsigned char) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}}
|
||||
((long) C == b) +
|
||||
((int) C == b) +
|
||||
((short) C == b) +
|
||||
|
@ -101,8 +101,8 @@ int test0(long a, unsigned long b) {
|
|||
((signed char) C == (unsigned char) b) +
|
||||
(C < (unsigned long) b) +
|
||||
(C < (unsigned int) b) +
|
||||
(C < (unsigned short) b) + // expected-warning {{comparison of constant 65536 with expression of type 'unsigned short' is always false}}
|
||||
(C < (unsigned char) b) + // expected-warning {{comparison of constant 65536 with expression of type 'unsigned char' is always false}}
|
||||
(C < (unsigned short) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned short' is always false}}
|
||||
(C < (unsigned char) b) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'unsigned char' is always false}}
|
||||
((long) C < b) +
|
||||
((int) C < b) +
|
||||
((short) C < b) +
|
||||
|
@ -119,8 +119,8 @@ int test0(long a, unsigned long b) {
|
|||
(a == (unsigned char) C) +
|
||||
((long) a == C) +
|
||||
((int) a == C) +
|
||||
((short) a == C) + // expected-warning {{comparison of constant 65536 with expression of type 'short' is always false}}
|
||||
((signed char) a == C) + // expected-warning {{comparison of constant 65536 with expression of type 'signed char' is always false}}
|
||||
((short) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always false}}
|
||||
((signed char) a == C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always false}}
|
||||
((long) a == (unsigned long) C) +
|
||||
((int) a == (unsigned int) C) +
|
||||
((short) a == (unsigned short) C) +
|
||||
|
@ -131,8 +131,8 @@ int test0(long a, unsigned long b) {
|
|||
(a < (unsigned char) C) +
|
||||
((long) a < C) +
|
||||
((int) a < C) +
|
||||
((short) a < C) + // expected-warning {{comparison of constant 65536 with expression of type 'short' is always true}}
|
||||
((signed char) a < C) + // expected-warning {{comparison of constant 65536 with expression of type 'signed char' is always true}}
|
||||
((short) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'short' is always true}}
|
||||
((signed char) a < C) + // expected-warning {{comparison of constant 'C' (65536) with expression of type 'signed char' is always true}}
|
||||
((long) a < (unsigned long) C) + // expected-warning {{comparison of integers of different signs}}
|
||||
((int) a < (unsigned int) C) + // expected-warning {{comparison of integers of different signs}}
|
||||
((short) a < (unsigned short) C) +
|
||||
|
|
|
@ -39,8 +39,8 @@ void test () {
|
|||
while (b == c);
|
||||
while (B1 == name1::B2);
|
||||
while (B2 == name2::B1);
|
||||
while (x == AnonAA); // expected-warning {{comparison of constant 42 with expression of type 'Foo' is always false}}
|
||||
while (AnonBB == y); // expected-warning {{comparison of constant 45 with expression of type 'Bar' is always false}}
|
||||
while (x == AnonAA); // expected-warning {{comparison of constant 'AnonAA' (42) with expression of type 'Foo' is always false}}
|
||||
while (AnonBB == y); // expected-warning {{comparison of constant 'AnonBB' (45) with expression of type 'Bar' is always false}}
|
||||
while (AnonAA == AnonAB);
|
||||
while (AnonAB == AnonBA);
|
||||
while (AnonBB == AnonAA);
|
||||
|
|
Загрузка…
Ссылка в новой задаче