r313747 - [Sema] CheckTautologicalComparisonWithZero(): always complain about enums

Roman Lebedev via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 20 03:15:27 PDT 2017


Author: lebedevri
Date: Wed Sep 20 03:15:27 2017
New Revision: 313747

URL: http://llvm.org/viewvc/llvm-project?rev=313747&view=rev
Log:
[Sema] CheckTautologicalComparisonWithZero(): always complain about enums

Hopefully fixes test-clang-msc-x64-on-i686-linux-RA build.

The underlying problem is that the enum is signed there.
Yet still, it is invalid for it to contain negative values,
so the comparison is always tautological in this case.

No differential, but related to https://reviews.llvm.org/D37629

Modified:
    cfe/trunk/lib/Sema/SemaChecking.cpp

Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=313747&r1=313746&r2=313747&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Sep 20 03:15:27 2017
@@ -8592,22 +8592,26 @@ bool CheckTautologicalComparisonWithZero
 
   bool Match = true;
 
-  if (Op == BO_LT && isNonBooleanUnsignedValue(LHS) && IsZero(S, RHS)) {
+  if (Op == BO_LT && IsZero(S, RHS) &&
+      (isNonBooleanUnsignedValue(LHS) || HasEnumType(LHS))) {
     S.Diag(E->getOperatorLoc(),
            HasEnumType(LHS) ? diag::warn_lunsigned_enum_always_true_comparison
                             : diag::warn_lunsigned_always_true_comparison)
         << "< 0" << false << LHS->getSourceRange() << RHS->getSourceRange();
-  } else if (Op == BO_GE && isNonBooleanUnsignedValue(LHS) && IsZero(S, RHS)) {
+  } else if (Op == BO_GE && IsZero(S, RHS) &&
+             (isNonBooleanUnsignedValue(LHS) || HasEnumType(LHS))) {
     S.Diag(E->getOperatorLoc(),
            HasEnumType(LHS) ? diag::warn_lunsigned_enum_always_true_comparison
                             : diag::warn_lunsigned_always_true_comparison)
         << ">= 0" << true << LHS->getSourceRange() << RHS->getSourceRange();
-  } else if (Op == BO_GT && isNonBooleanUnsignedValue(RHS) && IsZero(S, LHS)) {
+  } else if (Op == BO_GT && IsZero(S, LHS) &&
+             (isNonBooleanUnsignedValue(RHS) || HasEnumType(RHS))) {
     S.Diag(E->getOperatorLoc(),
            HasEnumType(RHS) ? diag::warn_runsigned_enum_always_true_comparison
                             : diag::warn_runsigned_always_true_comparison)
         << "0 >" << false << LHS->getSourceRange() << RHS->getSourceRange();
-  } else if (Op == BO_LE && isNonBooleanUnsignedValue(RHS) && IsZero(S, LHS)) {
+  } else if (Op == BO_LE && IsZero(S, LHS) &&
+             (isNonBooleanUnsignedValue(RHS) || HasEnumType(RHS))) {
     S.Diag(E->getOperatorLoc(),
            HasEnumType(RHS) ? diag::warn_runsigned_enum_always_true_comparison
                             : diag::warn_runsigned_always_true_comparison)




More information about the cfe-commits mailing list