<div dir="ltr">Hi Roman,<div><br></div><div>This commit has caused a regression in LLVM 6 which now triggers -Wsign-compare for typeof(enum) and typeof(enumConstant). I filed <a href="https://bugs.llvm.org/show_bug.cgi?id=36008">https://bugs.llvm.org/show_bug.cgi?id=36008</a>. Could you please take a look at it?</div><div><br></div><div>Thanks,</div><div>Alex</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 21 October 2017 at 09:44, Roman Lebedev via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: lebedevri<br>
Date: Sat Oct 21 09:44:03 2017<br>
New Revision: 316268<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=316268&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=316268&view=rev</a><br>
Log:<br>
[Sema] Fixes for enum handling for tautological comparison diagnostics<br>
<br>
Summary:<br>
As Mattias Eriksson has reported in PR35009, in C, for enums, the underlying type should<br>
be used when checking for the tautological comparison, unlike C++, where the enumerator<br>
values define the value range. So if not in CPlusPlus mode, use the enum underlying type.<br>
<br>
Also, i have discovered a problem (a crash) when evaluating tautological-ness of the following comparison:<br>
```<br>
enum A { A_a = 0 };<br>
if (a < 0) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
return 0;<br>
```<br>
This affects both the C and C++, but after the first fix, only C++ code was affected.<br>
That was also fixed, while preserving (i think?) the proper diagnostic output.<br>
<br>
And while there, attempt to enhance the test coverage.<br>
Yes, some tests got moved around, sorry about that :)<br>
<br>
Fixes PR35009<br>
<br>
Reviewers: aaron.ballman, rsmith, rjmccall<br>
<br>
Reviewed By: aaron.ballman<br>
<br>
Subscribers: Rakete1111, efriedma, materi, cfe-commits<br>
<br>
Tags: #clang<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D39122" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D39122</a><br>
<br>
Added:<br>
    cfe/trunk/test/Sema/outof-<wbr>range-enum-constant-compare.c<br>
    cfe/trunk/test/Sema/<wbr>tautological-constant-enum-<wbr>compare.c<br>
Modified:<br>
    cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp<br>
    cfe/trunk/test/Sema/<wbr>tautological-unsigned-enum-<wbr>zero-compare.c<br>
    cfe/trunk/test/Sema/<wbr>tautological-unsigned-enum-<wbr>zero-compare.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=316268&r1=316267&r2=316268&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp?rev=316268&<wbr>r1=316267&r2=316268&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp (original)<br>
+++ cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp Sat Oct 21 09:44:03 2017<br>
@@ -8181,8 +8181,12 @@ struct IntRange {<br>
     if (const AtomicType *AT = dyn_cast<AtomicType>(T))<br>
       T = AT->getValueType().getTypePtr(<wbr>);<br>
<br>
-    // For enum types, use the known bit width of the enumerators.<br>
-    if (const EnumType *ET = dyn_cast<EnumType>(T)) {<br>
+    if (!C.getLangOpts().CPlusPlus) {<br>
+      // For enum types in C code, use the underlying datatype.<br>
+      if (const EnumType *ET = dyn_cast<EnumType>(T))<br>
+        T = ET->getDecl()->getIntegerType(<wbr>).getDesugaredType(C).<wbr>getTypePtr();<br>
+    } else if (const EnumType *ET = dyn_cast<EnumType>(T)) {<br>
+      // For enum types in C++, use the known bit width of the enumerators.<br>
       EnumDecl *Enum = ET->getDecl();<br>
       // In C++11, enums without definitions can have an explicitly specified<br>
       // underlying type.  Use this type to compute the range.<br>
@@ -8584,8 +8588,10 @@ bool isNonBooleanUnsignedValue(Expr *E)<br>
 }<br>
<br>
 enum class LimitType {<br>
-  Max, // e.g. 32767 for short<br>
-  Min  // e.g. -32768 for short<br>
+  Max = 1U << 0U,  // e.g. 32767 for short<br>
+  Min = 1U << 1U,  // e.g. -32768 for short<br>
+  Both = Max | Min // When the value is both the Min and the Max limit at the<br>
+                   // same time; e.g. in C++, A::a in enum A { a = 0 };<br>
 };<br>
<br>
 /// Checks whether Expr 'Constant' may be the<br>
@@ -8608,6 +8614,10 @@ llvm::Optional<LimitType> IsTypeLimit(Se<br>
<br>
   IntRange OtherRange = IntRange::forValueOfType(S.<wbr>Context, OtherT);<br>
<br>
+  // Special-case for C++ for enum with one enumerator with value of 0.<br>
+  if (OtherRange.Width == 0)<br>
+    return Value == 0 ? LimitType::Both : llvm::Optional<LimitType>();<br>
+<br>
   if (llvm::APSInt::isSameValue(<br>
           llvm::APSInt::getMaxValue(<wbr>OtherRange.Width,<br>
                                     OtherT->isUnsignedIntegerType(<wbr>)),<br>
@@ -8620,7 +8630,7 @@ llvm::Optional<LimitType> IsTypeLimit(Se<br>
           Value))<br>
     return LimitType::Min;<br>
<br>
-  return llvm::Optional<LimitType>();<br>
+  return llvm::None;<br>
 }<br>
<br>
 bool HasEnumType(Expr *E) {<br>
@@ -8655,9 +8665,12 @@ bool CheckTautologicalComparison(<wbr>Sema &S<br>
<br>
   bool ConstIsLowerBound = (Op == BO_LT || Op == BO_LE) ^ RhsConstant;<br>
   bool ResultWhenConstEqualsOther = (Op == BO_LE || Op == BO_GE);<br>
-  bool ResultWhenConstNeOther =<br>
-      ConstIsLowerBound ^ (ValueType == LimitType::Max);<br>
-  if (ResultWhenConstEqualsOther != ResultWhenConstNeOther)<br>
+  if (ValueType != LimitType::Both) {<br>
+    bool ResultWhenConstNeOther =<br>
+        ConstIsLowerBound ^ (ValueType == LimitType::Max);<br>
+    if (ResultWhenConstEqualsOther != ResultWhenConstNeOther)<br>
+      return false; // The comparison is not tautological.<br>
+  } else if (ResultWhenConstEqualsOther == ConstIsLowerBound)<br>
     return false; // The comparison is not tautological.<br>
<br>
   const bool Result = ResultWhenConstEqualsOther;<br>
<br>
Added: cfe/trunk/test/Sema/outof-<wbr>range-enum-constant-compare.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/outof-range-enum-constant-compare.c?rev=316268&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/Sema/<wbr>outof-range-enum-constant-<wbr>compare.c?rev=316268&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Sema/outof-<wbr>range-enum-constant-compare.c (added)<br>
+++ cfe/trunk/test/Sema/outof-<wbr>range-enum-constant-compare.c Sat Oct 21 09:44:03 2017<br>
@@ -0,0 +1,379 @@<br>
+// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -DUNSIGNED -verify %s<br>
+// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -DSIGNED -verify %s<br>
+// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -DUNSIGNED -DSILENCE -Wno-tautological-constant-<wbr>out-of-range-compare -verify %s<br>
+// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -DSIGNED -DSILENCE -Wno-tautological-constant-<wbr>out-of-range-compare -verify %s<br>
+<br>
+int main() {<br>
+  enum A { A_a = 2 };<br>
+  enum A a;<br>
+<br>
+#ifdef SILENCE<br>
+  // expected-no-diagnostics<br>
+#endif<br>
+<br>
+#ifdef UNSIGNED<br>
+#ifndef SILENCE<br>
+  if (a < 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (4294967296 >= a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a > 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (4294967296 <= a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (a <= 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (4294967296 > a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a >= 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (4294967296 < a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (a == 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (4294967296 != a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a != 4294967296) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (4294967296 == a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+<br>
+  if (a < 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (4294967296U >= a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a > 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (4294967296U <= a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (a <= 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (4294967296U > a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a >= 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (4294967296U < a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (a == 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (4294967296U != a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a != 4294967296U) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (4294967296U == a) // expected-warning {{comparison of constant 4294967296 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+#else // SILENCE<br>
+  if (a < 4294967296)<br>
+    return 0;<br>
+  if (4294967296 >= a)<br>
+    return 0;<br>
+  if (a > 4294967296)<br>
+    return 0;<br>
+  if (4294967296 <= a)<br>
+    return 0;<br>
+  if (a <= 4294967296)<br>
+    return 0;<br>
+  if (4294967296 > a)<br>
+    return 0;<br>
+  if (a >= 4294967296)<br>
+    return 0;<br>
+  if (4294967296 < a)<br>
+    return 0;<br>
+  if (a == 4294967296)<br>
+    return 0;<br>
+  if (4294967296 != a)<br>
+    return 0;<br>
+  if (a != 4294967296)<br>
+    return 0;<br>
+  if (4294967296 == a)<br>
+    return 0;<br>
+<br>
+  if (a < 4294967296U)<br>
+    return 0;<br>
+  if (4294967296U >= a)<br>
+    return 0;<br>
+  if (a > 4294967296U)<br>
+    return 0;<br>
+  if (4294967296U <= a)<br>
+    return 0;<br>
+  if (a <= 4294967296U)<br>
+    return 0;<br>
+  if (4294967296U > a)<br>
+    return 0;<br>
+  if (a >= 4294967296U)<br>
+    return 0;<br>
+  if (4294967296U < a)<br>
+    return 0;<br>
+  if (a == 4294967296U)<br>
+    return 0;<br>
+  if (4294967296U != a)<br>
+    return 0;<br>
+  if (a != 4294967296U)<br>
+    return 0;<br>
+  if (4294967296U == a)<br>
+    return 0;<br>
+#endif<br>
+#elif defined(SIGNED)<br>
+#ifndef SILENCE<br>
+  if (a < -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (-2147483649 >= a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (a > -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (-2147483649 <= a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a <= -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (-2147483649 > a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (a >= -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (-2147483649 < a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a == -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (-2147483649 != a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a != -2147483649) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (-2147483649 == a) // expected-warning {{comparison of constant -2147483649 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+<br>
+  if (a < 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (2147483648 >= a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a > 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (2147483648 <= a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (a <= 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (2147483648 > a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a >= 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (2147483648 < a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (a == 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+  if (2147483648 != a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a != 2147483648) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always true}}<br>
+    return 0;<br>
+  if (2147483648 == a) // expected-warning {{comparison of constant 2147483648 with expression of type 'enum A' is always false}}<br>
+    return 0;<br>
+#else // SILENCE<br>
+  if (a < -2147483649)<br>
+    return 0;<br>
+  if (-2147483649 >= a)<br>
+    return 0;<br>
+  if (a > -2147483649)<br>
+    return 0;<br>
+  if (-2147483649 <= a)<br>
+    return 0;<br>
+  if (a <= -2147483649)<br>
+    return 0;<br>
+  if (-2147483649 > a)<br>
+    return 0;<br>
+  if (a >= -2147483649)<br>
+    return 0;<br>
+  if (-2147483649 < a)<br>
+    return 0;<br>
+  if (a == -2147483649)<br>
+    return 0;<br>
+  if (-2147483649 != a)<br>
+    return 0;<br>
+  if (a != -2147483649)<br>
+    return 0;<br>
+  if (-2147483649 == a)<br>
+    return 0;<br>
+<br>
+  if (a < 2147483648)<br>
+    return 0;<br>
+  if (2147483648 >= a)<br>
+    return 0;<br>
+  if (a > 2147483648)<br>
+    return 0;<br>
+  if (2147483648 <= a)<br>
+    return 0;<br>
+  if (a <= 2147483648)<br>
+    return 0;<br>
+  if (2147483648 > a)<br>
+    return 0;<br>
+  if (a >= 2147483648)<br>
+    return 0;<br>
+  if (2147483648 < a)<br>
+    return 0;<br>
+  if (a == 2147483648)<br>
+    return 0;<br>
+  if (2147483648 != a)<br>
+    return 0;<br>
+  if (a != 2147483648)<br>
+    return 0;<br>
+  if (2147483648 == a)<br>
+    return 0;<br>
+#endif<br>
+#endif<br>
+}<br>
+<br>
+// <a href="https://bugs.llvm.org/show_bug.cgi?id=35009" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_<wbr>bug.cgi?id=35009</a><br>
+int PR35009() {<br>
+  enum A { A_a = 2 };<br>
+  enum A a;<br>
+<br>
+  // in C, this should not warn.<br>
+<br>
+  if (a < 1)<br>
+    return 0;<br>
+  if (1 >= a)<br>
+    return 0;<br>
+  if (a > 1)<br>
+    return 0;<br>
+  if (1 <= a)<br>
+    return 0;<br>
+  if (a <= 1)<br>
+    return 0;<br>
+  if (1 > a)<br>
+    return 0;<br>
+  if (a >= 1)<br>
+    return 0;<br>
+  if (1 < a)<br>
+    return 0;<br>
+  if (a == 1)<br>
+    return 0;<br>
+  if (1 != a)<br>
+    return 0;<br>
+  if (a != 1)<br>
+    return 0;<br>
+  if (1 == a)<br>
+    return 0;<br>
+<br>
+  if (a < 1U)<br>
+    return 0;<br>
+  if (1U >= a)<br>
+    return 0;<br>
+  if (a > 1U)<br>
+    return 0;<br>
+  if (1U <= a)<br>
+    return 0;<br>
+  if (a <= 1U)<br>
+    return 0;<br>
+  if (1U > a)<br>
+    return 0;<br>
+  if (a >= 1U)<br>
+    return 0;<br>
+  if (1U < a)<br>
+    return 0;<br>
+  if (a == 1U)<br>
+    return 0;<br>
+  if (1U != a)<br>
+    return 0;<br>
+  if (a != 1U)<br>
+    return 0;<br>
+  if (1U == a)<br>
+    return 0;<br>
+<br>
+  if (a < 2)<br>
+    return 0;<br>
+  if (2 >= a)<br>
+    return 0;<br>
+  if (a > 2)<br>
+    return 0;<br>
+  if (2 <= a)<br>
+    return 0;<br>
+  if (a <= 2)<br>
+    return 0;<br>
+  if (2 > a)<br>
+    return 0;<br>
+  if (a >= 2)<br>
+    return 0;<br>
+  if (2 < a)<br>
+    return 0;<br>
+  if (a == 2)<br>
+    return 0;<br>
+  if (2 != a)<br>
+    return 0;<br>
+  if (a != 2)<br>
+    return 0;<br>
+  if (2 == a)<br>
+    return 0;<br>
+<br>
+  if (a < 2U)<br>
+    return 0;<br>
+  if (2U >= a)<br>
+    return 0;<br>
+  if (a > 2U)<br>
+    return 0;<br>
+  if (2U <= a)<br>
+    return 0;<br>
+  if (a <= 2U)<br>
+    return 0;<br>
+  if (2U > a)<br>
+    return 0;<br>
+  if (a >= 2U)<br>
+    return 0;<br>
+  if (2U < a)<br>
+    return 0;<br>
+  if (a == 2U)<br>
+    return 0;<br>
+  if (2U != a)<br>
+    return 0;<br>
+  if (a != 2U)<br>
+    return 0;<br>
+  if (2U == a)<br>
+    return 0;<br>
+<br>
+  if (a < 3)<br>
+    return 0;<br>
+  if (3 >= a)<br>
+    return 0;<br>
+  if (a > 3)<br>
+    return 0;<br>
+  if (3 <= a)<br>
+    return 0;<br>
+  if (a <= 3)<br>
+    return 0;<br>
+  if (3 > a)<br>
+    return 0;<br>
+  if (a >= 3)<br>
+    return 0;<br>
+  if (3 < a)<br>
+    return 0;<br>
+  if (a == 3)<br>
+    return 0;<br>
+  if (3 != a)<br>
+    return 0;<br>
+  if (a != 3)<br>
+    return 0;<br>
+  if (3 == a)<br>
+    return 0;<br>
+<br>
+  if (a < 3U)<br>
+    return 0;<br>
+  if (3U >= a)<br>
+    return 0;<br>
+  if (a > 3U)<br>
+    return 0;<br>
+  if (3U <= a)<br>
+    return 0;<br>
+  if (a <= 3U)<br>
+    return 0;<br>
+  if (3U > a)<br>
+    return 0;<br>
+  if (a >= 3U)<br>
+    return 0;<br>
+  if (3U < a)<br>
+    return 0;<br>
+  if (a == 3U)<br>
+    return 0;<br>
+  if (3U != a)<br>
+    return 0;<br>
+  if (a != 3U)<br>
+    return 0;<br>
+  if (3U == a)<br>
+    return 0;<br>
+<br>
+  return 1;<br>
+}<br>
<br>
Added: cfe/trunk/test/Sema/<wbr>tautological-constant-enum-<wbr>compare.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/tautological-constant-enum-compare.c?rev=316268&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/Sema/<wbr>tautological-constant-enum-<wbr>compare.c?rev=316268&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Sema/<wbr>tautological-constant-enum-<wbr>compare.c (added)<br>
+++ cfe/trunk/test/Sema/<wbr>tautological-constant-enum-<wbr>compare.c Sat Oct 21 09:44:03 2017<br>
@@ -0,0 +1,419 @@<br>
+// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -DUNSIGNED -verify %s<br>
+// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -DSIGNED -verify %s<br>
+// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -DUNSIGNED -DSILENCE -Wno-tautological-constant-<wbr>compare -verify %s<br>
+// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -DSIGNED -DSILENCE -Wno-tautological-constant-<wbr>compare -verify %s<br>
+<br>
+int main() {<br>
+  enum A { A_a = 2 };<br>
+  enum A a;<br>
+<br>
+#ifdef SILENCE<br>
+  // expected-no-diagnostics<br>
+#endif<br>
+<br>
+#ifdef UNSIGNED<br>
+#ifndef SILENCE<br>
+  if (a < 0) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
+    return 0;<br>
+  if (0 >= a)<br>
+    return 0;<br>
+  if (a > 0)<br>
+    return 0;<br>
+  if (0 <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
+    return 0;<br>
+  if (a <= 0)<br>
+    return 0;<br>
+  if (0 > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
+    return 0;<br>
+  if (a >= 0) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0 < a)<br>
+    return 0;<br>
+<br>
+  if (a < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
+    return 0;<br>
+  if (0U >= a)<br>
+    return 0;<br>
+  if (a > 0U)<br>
+    return 0;<br>
+  if (0U <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
+    return 0;<br>
+  if (a <= 0U)<br>
+    return 0;<br>
+  if (0U > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
+    return 0;<br>
+  if (a >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0U < a)<br>
+    return 0;<br>
+<br>
+  if (a < 4294967295)<br>
+    return 0;<br>
+  if (4294967295 >= a) // expected-warning {{comparison 4294967295 >= 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a > 4294967295) // expected-warning {{comparison 'enum A' > 4294967295 is always false}}<br>
+    return 0;<br>
+  if (4294967295 <= a)<br>
+    return 0;<br>
+  if (a <= 4294967295) // expected-warning {{comparison 'enum A' <= 4294967295 is always true}}<br>
+    return 0;<br>
+  if (4294967295 > a)<br>
+    return 0;<br>
+  if (a >= 4294967295)<br>
+    return 0;<br>
+  if (4294967295 < a) // expected-warning {{comparison 4294967295 < 'enum A' is always false}}<br>
+    return 0;<br>
+<br>
+  if (a < 4294967295U)<br>
+    return 0;<br>
+  if (4294967295U >= a) // expected-warning {{comparison 4294967295 >= 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a > 4294967295U) // expected-warning {{comparison 'enum A' > 4294967295 is always false}}<br>
+    return 0;<br>
+  if (4294967295U <= a)<br>
+    return 0;<br>
+  if (a <= 4294967295U) // expected-warning {{comparison 'enum A' <= 4294967295 is always true}}<br>
+    return 0;<br>
+  if (4294967295U > a)<br>
+    return 0;<br>
+  if (a >= 4294967295U)<br>
+    return 0;<br>
+  if (4294967295U < a) // expected-warning {{comparison 4294967295 < 'enum A' is always false}}<br>
+    return 0;<br>
+#else // SILENCE<br>
+  if (a < 0)<br>
+    return 0;<br>
+  if (0 >= a)<br>
+    return 0;<br>
+  if (a > 0)<br>
+    return 0;<br>
+  if (0 <= a)<br>
+    return 0;<br>
+  if (a <= 0)<br>
+    return 0;<br>
+  if (0 > a)<br>
+    return 0;<br>
+  if (a >= 0)<br>
+    return 0;<br>
+  if (0 < a)<br>
+    return 0;<br>
+<br>
+  if (a < 0U)<br>
+    return 0;<br>
+  if (0U >= a)<br>
+    return 0;<br>
+  if (a > 0U)<br>
+    return 0;<br>
+  if (0U <= a)<br>
+    return 0;<br>
+  if (a <= 0U)<br>
+    return 0;<br>
+  if (0U > a)<br>
+    return 0;<br>
+  if (a >= 0U)<br>
+    return 0;<br>
+  if (0U < a)<br>
+    return 0;<br>
+<br>
+  if (a < 4294967295)<br>
+    return 0;<br>
+  if (4294967295 >= a)<br>
+    return 0;<br>
+  if (a > 4294967295)<br>
+    return 0;<br>
+  if (4294967295 <= a)<br>
+    return 0;<br>
+  if (a <= 4294967295)<br>
+    return 0;<br>
+  if (4294967295 > a)<br>
+    return 0;<br>
+  if (a >= 4294967295)<br>
+    return 0;<br>
+  if (4294967295 < a)<br>
+    return 0;<br>
+<br>
+  if (a < 4294967295U)<br>
+    return 0;<br>
+  if (4294967295U >= a)<br>
+    return 0;<br>
+  if (a > 4294967295U)<br>
+    return 0;<br>
+  if (4294967295U <= a)<br>
+    return 0;<br>
+  if (a <= 4294967295U)<br>
+    return 0;<br>
+  if (4294967295U > a)<br>
+    return 0;<br>
+  if (a >= 4294967295U)<br>
+    return 0;<br>
+  if (4294967295U < a)<br>
+    return 0;<br>
+#endif<br>
+#elif defined(SIGNED)<br>
+#ifndef SILENCE<br>
+  if (a < -2147483648) // expected-warning {{comparison 'enum A' < -2147483648 is always false}}<br>
+    return 0;<br>
+  if (-2147483648 >= a)<br>
+    return 0;<br>
+  if (a > -2147483648)<br>
+    return 0;<br>
+  if (-2147483648 <= a) // expected-warning {{comparison -2147483648 <= 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a <= -2147483648)<br>
+    return 0;<br>
+  if (-2147483648 > a) // expected-warning {{comparison -2147483648 > 'enum A' is always false}}<br>
+    return 0;<br>
+  if (a >= -2147483648) // expected-warning {{comparison 'enum A' >= -2147483648 is always true}}<br>
+    return 0;<br>
+  if (-2147483648 < a)<br>
+    return 0;<br>
+<br>
+  if (a < 2147483647)<br>
+    return 0;<br>
+  if (2147483647 >= a) // expected-warning {{comparison 2147483647 >= 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a > 2147483647) // expected-warning {{comparison 'enum A' > 2147483647 is always false}}<br>
+    return 0;<br>
+  if (2147483647 <= a)<br>
+    return 0;<br>
+  if (a <= 2147483647) // expected-warning {{comparison 'enum A' <= 2147483647 is always true}}<br>
+    return 0;<br>
+  if (2147483647 > a)<br>
+    return 0;<br>
+  if (a >= 2147483647)<br>
+    return 0;<br>
+  if (2147483647 < a) // expected-warning {{comparison 2147483647 < 'enum A' is always false}}<br>
+    return 0;<br>
+<br>
+  if (a < 2147483647U)<br>
+    return 0;<br>
+  if (2147483647U >= a) // expected-warning {{comparison 2147483647 >= 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a > 2147483647U) // expected-warning {{comparison 'enum A' > 2147483647 is always false}}<br>
+    return 0;<br>
+  if (2147483647U <= a)<br>
+    return 0;<br>
+  if (a <= 2147483647U) // expected-warning {{comparison 'enum A' <= 2147483647 is always true}}<br>
+    return 0;<br>
+  if (2147483647U > a)<br>
+    return 0;<br>
+  if (a >= 2147483647U)<br>
+    return 0;<br>
+  if (2147483647U < a) // expected-warning {{comparison 2147483647 < 'enum A' is always false}}<br>
+    return 0;<br>
+#else // SILENCE<br>
+  if (a < -2147483648)<br>
+    return 0;<br>
+  if (-2147483648 >= a)<br>
+    return 0;<br>
+  if (a > -2147483648)<br>
+    return 0;<br>
+  if (-2147483648 <= a)<br>
+    return 0;<br>
+  if (a <= -2147483648)<br>
+    return 0;<br>
+  if (-2147483648 > a)<br>
+    return 0;<br>
+  if (a >= -2147483648)<br>
+    return 0;<br>
+  if (-2147483648 < a)<br>
+    return 0;<br>
+<br>
+  if (a < 2147483647)<br>
+    return 0;<br>
+  if (2147483647 >= a)<br>
+    return 0;<br>
+  if (a > 2147483647)<br>
+    return 0;<br>
+  if (2147483647 <= a)<br>
+    return 0;<br>
+  if (a <= 2147483647)<br>
+    return 0;<br>
+  if (2147483647 > a)<br>
+    return 0;<br>
+  if (a >= 2147483647)<br>
+    return 0;<br>
+  if (2147483647 < a)<br>
+    return 0;<br>
+<br>
+  if (a < 2147483647U)<br>
+    return 0;<br>
+  if (2147483647U >= a)<br>
+    return 0;<br>
+  if (a > 2147483647U)<br>
+    return 0;<br>
+  if (2147483647U <= a)<br>
+    return 0;<br>
+  if (a <= 2147483647U)<br>
+    return 0;<br>
+  if (2147483647U > a)<br>
+    return 0;<br>
+  if (a >= 2147483647U)<br>
+    return 0;<br>
+  if (2147483647U < a)<br>
+    return 0;<br>
+#endif<br>
+#endif<br>
+<br>
+  return 1;<br>
+}<br>
+<br>
+// <a href="https://bugs.llvm.org/show_bug.cgi?id=35009" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_<wbr>bug.cgi?id=35009</a><br>
+int PR35009() {<br>
+  enum A { A_a = 2 };<br>
+  enum A a;<br>
+<br>
+  // in C, this should not warn.<br>
+<br>
+  if (a < 1)<br>
+    return 0;<br>
+  if (1 >= a)<br>
+    return 0;<br>
+  if (a > 1)<br>
+    return 0;<br>
+  if (1 <= a)<br>
+    return 0;<br>
+  if (a <= 1)<br>
+    return 0;<br>
+  if (1 > a)<br>
+    return 0;<br>
+  if (a >= 1)<br>
+    return 0;<br>
+  if (1 < a)<br>
+    return 0;<br>
+  if (a == 1)<br>
+    return 0;<br>
+  if (1 != a)<br>
+    return 0;<br>
+  if (a != 1)<br>
+    return 0;<br>
+  if (1 == a)<br>
+    return 0;<br>
+<br>
+  if (a < 1U)<br>
+    return 0;<br>
+  if (1U >= a)<br>
+    return 0;<br>
+  if (a > 1U)<br>
+    return 0;<br>
+  if (1U <= a)<br>
+    return 0;<br>
+  if (a <= 1U)<br>
+    return 0;<br>
+  if (1U > a)<br>
+    return 0;<br>
+  if (a >= 1U)<br>
+    return 0;<br>
+  if (1U < a)<br>
+    return 0;<br>
+  if (a == 1U)<br>
+    return 0;<br>
+  if (1U != a)<br>
+    return 0;<br>
+  if (a != 1U)<br>
+    return 0;<br>
+  if (1U == a)<br>
+    return 0;<br>
+<br>
+  if (a < 2)<br>
+    return 0;<br>
+  if (2 >= a)<br>
+    return 0;<br>
+  if (a > 2)<br>
+    return 0;<br>
+  if (2 <= a)<br>
+    return 0;<br>
+  if (a <= 2)<br>
+    return 0;<br>
+  if (2 > a)<br>
+    return 0;<br>
+  if (a >= 2)<br>
+    return 0;<br>
+  if (2 < a)<br>
+    return 0;<br>
+  if (a == 2)<br>
+    return 0;<br>
+  if (2 != a)<br>
+    return 0;<br>
+  if (a != 2)<br>
+    return 0;<br>
+  if (2 == a)<br>
+    return 0;<br>
+<br>
+  if (a < 2U)<br>
+    return 0;<br>
+  if (2U >= a)<br>
+    return 0;<br>
+  if (a > 2U)<br>
+    return 0;<br>
+  if (2U <= a)<br>
+    return 0;<br>
+  if (a <= 2U)<br>
+    return 0;<br>
+  if (2U > a)<br>
+    return 0;<br>
+  if (a >= 2U)<br>
+    return 0;<br>
+  if (2U < a)<br>
+    return 0;<br>
+  if (a == 2U)<br>
+    return 0;<br>
+  if (2U != a)<br>
+    return 0;<br>
+  if (a != 2U)<br>
+    return 0;<br>
+  if (2U == a)<br>
+    return 0;<br>
+<br>
+  if (a < 3)<br>
+    return 0;<br>
+  if (3 >= a)<br>
+    return 0;<br>
+  if (a > 3)<br>
+    return 0;<br>
+  if (3 <= a)<br>
+    return 0;<br>
+  if (a <= 3)<br>
+    return 0;<br>
+  if (3 > a)<br>
+    return 0;<br>
+  if (a >= 3)<br>
+    return 0;<br>
+  if (3 < a)<br>
+    return 0;<br>
+  if (a == 3)<br>
+    return 0;<br>
+  if (3 != a)<br>
+    return 0;<br>
+  if (a != 3)<br>
+    return 0;<br>
+  if (3 == a)<br>
+    return 0;<br>
+<br>
+  if (a < 3U)<br>
+    return 0;<br>
+  if (3U >= a)<br>
+    return 0;<br>
+  if (a > 3U)<br>
+    return 0;<br>
+  if (3U <= a)<br>
+    return 0;<br>
+  if (a <= 3U)<br>
+    return 0;<br>
+  if (3U > a)<br>
+    return 0;<br>
+  if (a >= 3U)<br>
+    return 0;<br>
+  if (3U < a)<br>
+    return 0;<br>
+  if (a == 3U)<br>
+    return 0;<br>
+  if (3U != a)<br>
+    return 0;<br>
+  if (a != 3U)<br>
+    return 0;<br>
+  if (3U == a)<br>
+    return 0;<br>
+<br>
+  return 1;<br>
+}<br>
<br>
Modified: cfe/trunk/test/Sema/<wbr>tautological-unsigned-enum-<wbr>zero-compare.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/tautological-unsigned-enum-zero-compare.c?rev=316268&r1=316267&r2=316268&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/Sema/<wbr>tautological-unsigned-enum-<wbr>zero-compare.c?rev=316268&r1=<wbr>316267&r2=316268&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Sema/<wbr>tautological-unsigned-enum-<wbr>zero-compare.c (original)<br>
+++ cfe/trunk/test/Sema/<wbr>tautological-unsigned-enum-<wbr>zero-compare.c Sat Oct 21 09:44:03 2017<br>
@@ -1,5 +1,5 @@<br>
-// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -DALL_WARN -verify %s<br>
-// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -DSIGN_WARN -verify %s<br>
+// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -fsyntax-only -DUNSIGNED -verify %s<br>
+// RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -DSIGNED -verify %s<br>
 // RUN: %clang_cc1 -triple=x86_64-pc-win32 -fsyntax-only -Wno-tautological-unsigned-<wbr>enum-zero-compare -verify %s<br>
<br>
 // Okay, this is where it gets complicated.<br>
@@ -7,62 +7,254 @@<br>
 // On windows, it is signed by default. We do not want to warn in that case.<br>
<br>
 int main() {<br>
-  enum A { A_foo, A_bar };<br>
+  enum A { A_a = 0 };<br>
   enum A a;<br>
+  enum B { B_a = -1 };<br>
+  enum B b;<br>
<br>
-#ifdef ALL_WARN<br>
+#ifdef UNSIGNED<br>
   if (a < 0) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (a >= 0) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0 >= a)<br>
+    return 0;<br>
+  if (a > 0)<br>
     return 0;<br>
   if (0 <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (a <= 0)<br>
+    return 0;<br>
   if (0 > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
+  if (a >= 0) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0 < a)<br>
+    return 0;<br>
+<br>
   if (a < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (a >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0U >= a)<br>
+    return 0;<br>
+  if (a > 0U)<br>
     return 0;<br>
   if (0U <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (a <= 0U)<br>
+    return 0;<br>
   if (0U > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
-#elif defined(SIGN_WARN)<br>
-  if (a < 0) // ok<br>
+  if (a >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0U < a)<br>
+    return 0;<br>
+<br>
+  if (b < 0)<br>
+    return 0;<br>
+  if (0 >= b)<br>
+    return 0;<br>
+  if (b > 0)<br>
+    return 0;<br>
+  if (0 <= b)<br>
+    return 0;<br>
+  if (b <= 0)<br>
+    return 0;<br>
+  if (0 > b)<br>
+    return 0;<br>
+  if (b >= 0)<br>
+    return 0;<br>
+  if (0 < b)<br>
+    return 0;<br>
+<br>
+  if (b < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
+    return 0;<br>
+  if (0U >= b)<br>
+    return 0;<br>
+  if (b > 0U)<br>
+    return 0;<br>
+  if (0U <= b) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
+    return 0;<br>
+  if (b <= 0U)<br>
+    return 0;<br>
+  if (0U > b) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
+    return 0;<br>
+  if (b >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
     return 0;<br>
-  if (a >= 0) // ok<br>
+  if (0U < b)<br>
     return 0;<br>
-  if (0 <= a) // ok<br>
+#elif defined(SIGNED)<br>
+  if (a < 0)<br>
+    return 0;<br>
+  if (0 >= a)<br>
+    return 0;<br>
+  if (a > 0)<br>
+    return 0;<br>
+  if (0 <= a)<br>
+    return 0;<br>
+  if (a <= 0)<br>
     return 0;<br>
-  if (0 > a) // ok<br>
+  if (0 > a)<br>
     return 0;<br>
+  if (a >= 0)<br>
+    return 0;<br>
+  if (0 < a)<br>
+    return 0;<br>
+<br>
   if (a < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (a >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0U >= a)<br>
+    return 0;<br>
+  if (a > 0U)<br>
     return 0;<br>
   if (0U <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (a <= 0U)<br>
+    return 0;<br>
   if (0U > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
+  if (a >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0U < a)<br>
+    return 0;<br>
+<br>
+  if (b < 0)<br>
+    return 0;<br>
+  if (0 >= b)<br>
+    return 0;<br>
+  if (b > 0)<br>
+    return 0;<br>
+  if (0 <= b)<br>
+    return 0;<br>
+  if (b <= 0)<br>
+    return 0;<br>
+  if (0 > b)<br>
+    return 0;<br>
+  if (b >= 0)<br>
+    return 0;<br>
+  if (0 < b)<br>
+    return 0;<br>
+<br>
+  if (b < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
+    return 0;<br>
+  if (0U >= b)<br>
+    return 0;<br>
+  if (b > 0U)<br>
+    return 0;<br>
+  if (0U <= b) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
+    return 0;<br>
+  if (b <= 0U)<br>
+    return 0;<br>
+  if (0U > b) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
+    return 0;<br>
+  if (b >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0U < b)<br>
+    return 0;<br>
 #else<br>
   // expected-no-diagnostics<br>
+<br>
   if (a < 0)<br>
     return 0;<br>
-  if (a >= 0)<br>
+  if (0 >= a)<br>
+    return 0;<br>
+  if (a > 0)<br>
     return 0;<br>
   if (0 <= a)<br>
     return 0;<br>
+  if (a <= 0)<br>
+    return 0;<br>
   if (0 > a)<br>
     return 0;<br>
+  if (a >= 0)<br>
+    return 0;<br>
+  if (0 < a)<br>
+    return 0;<br>
+<br>
   if (a < 0U)<br>
     return 0;<br>
-  if (a >= 0U)<br>
+  if (0U >= a)<br>
+    return 0;<br>
+  if (a > 0U)<br>
     return 0;<br>
   if (0U <= a)<br>
     return 0;<br>
+  if (a <= 0U)<br>
+    return 0;<br>
   if (0U > a)<br>
     return 0;<br>
+  if (a >= 0U)<br>
+    return 0;<br>
+  if (0U < a)<br>
+    return 0;<br>
+<br>
+  if (b < 0)<br>
+    return 0;<br>
+  if (0 >= b)<br>
+    return 0;<br>
+  if (b > 0)<br>
+    return 0;<br>
+  if (0 <= b)<br>
+    return 0;<br>
+  if (b <= 0)<br>
+    return 0;<br>
+  if (0 > b)<br>
+    return 0;<br>
+  if (b >= 0)<br>
+    return 0;<br>
+  if (0 < b)<br>
+    return 0;<br>
+<br>
+  if (b < 0U)<br>
+    return 0;<br>
+  if (0U >= b)<br>
+    return 0;<br>
+  if (b > 0U)<br>
+    return 0;<br>
+  if (0U <= b)<br>
+    return 0;<br>
+  if (b <= 0U)<br>
+    return 0;<br>
+  if (0U > b)<br>
+    return 0;<br>
+  if (b >= 0U)<br>
+    return 0;<br>
+  if (0U < b)<br>
+    return 0;<br>
 #endif<br>
<br>
+  if (a == 0)<br>
+    return 0;<br>
+  if (0 != a)<br>
+    return 0;<br>
+  if (a != 0)<br>
+    return 0;<br>
+  if (0 == a)<br>
+    return 0;<br>
+<br>
+  if (a == 0U)<br>
+    return 0;<br>
+  if (0U != a)<br>
+    return 0;<br>
+  if (a != 0U)<br>
+    return 0;<br>
+  if (0U == a)<br>
+    return 0;<br>
+<br>
+  if (b == 0)<br>
+    return 0;<br>
+  if (0 != b)<br>
+    return 0;<br>
+  if (b != 0)<br>
+    return 0;<br>
+  if (0 == b)<br>
+    return 0;<br>
+<br>
+  if (b == 0U)<br>
+    return 0;<br>
+  if (0U != b)<br>
+    return 0;<br>
+  if (b != 0U)<br>
+    return 0;<br>
+  if (0U == b)<br>
+    return 0;<br>
+<br>
   return 1;<br>
 }<br>
<br>
Modified: cfe/trunk/test/Sema/<wbr>tautological-unsigned-enum-<wbr>zero-compare.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/tautological-unsigned-enum-zero-compare.cpp?rev=316268&r1=316267&r2=316268&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/Sema/<wbr>tautological-unsigned-enum-<wbr>zero-compare.cpp?rev=316268&<wbr>r1=316267&r2=316268&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Sema/<wbr>tautological-unsigned-enum-<wbr>zero-compare.cpp (original)<br>
+++ cfe/trunk/test/Sema/<wbr>tautological-unsigned-enum-<wbr>zero-compare.cpp Sat Oct 21 09:44:03 2017<br>
@@ -1,176 +1,347 @@<br>
-// RUN: %clang_cc1 -std=c++11 -triple=x86_64-pc-linux-gnu -fsyntax-only -DALL_WARN -verify %s<br>
-// RUN: %clang_cc1 -std=c++11 -triple=x86_64-pc-win32 -fsyntax-only -DSIGN_WARN -verify %s<br>
-// RUN: %clang_cc1 -std=c++11 -triple=x86_64-pc-win32 -fsyntax-only -Wno-tautological-unsigned-<wbr>enum-zero-compare -verify %s<br>
+// RUN: %clang_cc1 -std=c++11 -triple=x86_64-pc-linux-gnu -fsyntax-only -DUNSIGNED -verify %s<br>
+// RUN: %clang_cc1 -std=c++11 -triple=x86_64-pc-win32 -fsyntax-only -DSIGNED -verify %s<br>
+// RUN: %clang_cc1 -std=c++11 -triple=x86_64-pc-win32 -fsyntax-only -DSILENCE -Wno-tautological-unsigned-<wbr>enum-zero-compare -verify %s<br>
<br>
 // Okay, this is where it gets complicated.<br>
 // Then default enum sigdness is target-specific.<br>
 // On windows, it is signed by default. We do not want to warn in that case.<br>
<br>
 int main() {<br>
-  enum A { A_foo, A_bar };<br>
+  enum A { A_foo = 0, A_bar, };<br>
   enum A a;<br>
<br>
-  enum B : unsigned { B_foo, B_bar };<br>
+  enum B : unsigned { B_foo = 0, B_bar, };<br>
   enum B b;<br>
<br>
-  enum C : signed { c_foo, c_bar };<br>
+  enum C : signed { C_foo = 0, C_bar, };<br>
   enum C c;<br>
<br>
-#ifdef ALL_WARN<br>
+#ifdef UNSIGNED<br>
   if (a < 0) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (a >= 0) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0 >= a)<br>
+    return 0;<br>
+  if (a > 0)<br>
     return 0;<br>
   if (0 <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (a <= 0)<br>
+    return 0;<br>
   if (0 > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
+  if (a >= 0) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0 < a)<br>
+    return 0;<br>
+<br>
   if (a < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (a >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0U >= a)<br>
+    return 0;<br>
+  if (a > 0U)<br>
     return 0;<br>
   if (0U <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (a <= 0U)<br>
+    return 0;<br>
   if (0U > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
+  if (a >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0U < a)<br>
+    return 0;<br>
<br>
   if (b < 0) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (b >= 0) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0 >= b)<br>
+    return 0;<br>
+  if (b > 0)<br>
     return 0;<br>
   if (0 <= b) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (b <= 0)<br>
+    return 0;<br>
   if (0 > b) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
+  if (b >= 0) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0 < b)<br>
+    return 0;<br>
+<br>
   if (b < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (b >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0U >= b)<br>
+    return 0;<br>
+  if (b > 0U)<br>
     return 0;<br>
   if (0U <= b) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (b <= 0U)<br>
+    return 0;<br>
   if (0U > b) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
+  if (b >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0U < b)<br>
+    return 0;<br>
<br>
-  if (c < 0) // ok<br>
+  if (c < 0)<br>
+    return 0;<br>
+  if (0 >= c) // expected-warning {{comparison 0 >= 'enum C' is always true}}<br>
+    return 0;<br>
+  if (c > 0) // expected-warning {{comparison 'enum C' > 0 is always false}}<br>
+    return 0;<br>
+  if (0 <= c)<br>
+    return 0;<br>
+  if (c <= 0) // expected-warning {{comparison 'enum C' <= 0 is always true}}<br>
     return 0;<br>
-  if (c >= 0) // ok<br>
+  if (0 > c)<br>
     return 0;<br>
-  if (0 <= c) // ok<br>
+  if (c >= 0)<br>
     return 0;<br>
-  if (0 > c) // ok<br>
+  if (0 < c) // expected-warning {{0 < 'enum C' is always false}}<br>
     return 0;<br>
+<br>
   if (c < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (c >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0U >= c)<br>
+    return 0;<br>
+  if (c > 0U)<br>
     return 0;<br>
   if (0U <= c) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (c <= 0U)<br>
+    return 0;<br>
   if (0U > c) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
-#elif defined(SIGN_WARN)<br>
-  if (a < 0) // ok<br>
+  if (c >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
     return 0;<br>
-  if (a >= 0) // ok<br>
+  if (0U < c)<br>
     return 0;<br>
-  if (0 <= a) // ok<br>
+#elif defined(SIGNED)<br>
+  if (a < 0)<br>
+    return 0;<br>
+  if (0 >= a) // expected-warning {{comparison 0 >= 'enum A' is always true}}<br>
     return 0;<br>
-  if (0 > a) // ok<br>
+  if (a > 0) // expected-warning {{comparison 'enum A' > 0 is always false}}<br>
+    return 0;<br>
+  if (0 <= a)<br>
     return 0;<br>
+  if (a <= 0) // expected-warning {{comparison 'enum A' <= 0 is always true}}<br>
+    return 0;<br>
+  if (0 > a)<br>
+    return 0;<br>
+  if (a >= 0)<br>
+    return 0;<br>
+  if (0 < a) // expected-warning {{comparison 0 < 'enum A' is always false}}<br>
+    return 0;<br>
+<br>
   if (a < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (a >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0U >= a)<br>
+    return 0;<br>
+  if (a > 0U)<br>
     return 0;<br>
   if (0U <= a) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (a <= 0U)<br>
+    return 0;<br>
   if (0U > a) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
+  if (a >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0U < a)<br>
+    return 0;<br>
<br>
   if (b < 0) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (b >= 0) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0 >= b)<br>
+    return 0;<br>
+  if (b > 0)<br>
     return 0;<br>
   if (0 <= b) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (b <= 0)<br>
+    return 0;<br>
   if (0 > b) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
+  if (b >= 0) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0 < b)<br>
+    return 0;<br>
+<br>
   if (b < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (b >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0U >= b)<br>
+    return 0;<br>
+  if (b > 0U)<br>
     return 0;<br>
   if (0U <= b) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (b <= 0U)<br>
+    return 0;<br>
   if (0U > b) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
+  if (b >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0U < b)<br>
+    return 0;<br>
<br>
-  if (c < 0) // ok<br>
+  if (c < 0)<br>
     return 0;<br>
-  if (c >= 0) // ok<br>
+  if (0 >= c) // expected-warning {{comparison 0 >= 'enum C' is always true}}<br>
     return 0;<br>
-  if (0 <= c) // ok<br>
+  if (c > 0) // expected-warning {{comparison 'enum C' > 0 is always false}}<br>
+    return 0;<br>
+  if (0 <= c)<br>
     return 0;<br>
-  if (0 > c) // ok<br>
+  if (c <= 0) // expected-warning {{comparison 'enum C' <= 0 is always true}}<br>
+    return 0;<br>
+  if (0 > c)<br>
+    return 0;<br>
+  if (c >= 0)<br>
     return 0;<br>
+  if (0 < c) // expected-warning {{0 < 'enum C' is always false}}<br>
+    return 0;<br>
+<br>
   if (c < 0U) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
     return 0;<br>
-  if (c >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+  if (0U >= c)<br>
+    return 0;<br>
+  if (c > 0U)<br>
     return 0;<br>
   if (0U <= c) // expected-warning {{comparison of 0 <= unsigned enum expression is always true}}<br>
     return 0;<br>
+  if (c <= 0U)<br>
+    return 0;<br>
   if (0U > c) // expected-warning {{comparison of 0 > unsigned enum expression is always false}}<br>
     return 0;<br>
+  if (c >= 0U) // expected-warning {{comparison of unsigned enum expression >= 0 is always true}}<br>
+    return 0;<br>
+  if (0U < c)<br>
+    return 0;<br>
 #else<br>
-  // expected-no-diagnostics<br>
   if (a < 0)<br>
     return 0;<br>
-  if (a >= 0)<br>
+  if (0 >= a) // expected-warning {{comparison 0 >= 'enum A' is always true}}<br>
+    return 0;<br>
+  if (a > 0) // expected-warning {{comparison 'enum A' > 0 is always false}}<br>
     return 0;<br>
   if (0 <= a)<br>
     return 0;<br>
+  if (a <= 0) // expected-warning {{comparison 'enum A' <= 0 is always true}}<br>
+    return 0;<br>
   if (0 > a)<br>
     return 0;<br>
+  if (a >= 0)<br>
+    return 0;<br>
+  if (0 < a) // expected-warning {{comparison 0 < 'enum A' is always false}}<br>
+    return 0;<br>
+<br>
   if (a < 0U)<br>
     return 0;<br>
-  if (a >= 0U)<br>
+  if (0U >= a)<br>
+    return 0;<br>
+  if (a > 0U)<br>
     return 0;<br>
   if (0U <= a)<br>
     return 0;<br>
+  if (a <= 0U)<br>
+    return 0;<br>
   if (0U > a)<br>
     return 0;<br>
+  if (a >= 0U)<br>
+    return 0;<br>
+  if (0U < a)<br>
+    return 0;<br>
<br>
   if (b < 0)<br>
     return 0;<br>
-  if (b >= 0)<br>
+  if (0 >= b)<br>
+    return 0;<br>
+  if (b > 0)<br>
     return 0;<br>
   if (0 <= b)<br>
     return 0;<br>
+  if (b <= 0)<br>
+    return 0;<br>
   if (0 > b)<br>
     return 0;<br>
+  if (b >= 0)<br>
+    return 0;<br>
+  if (0 < b)<br>
+    return 0;<br>
+<br>
   if (b < 0U)<br>
     return 0;<br>
-  if (b >= 0U)<br>
+  if (0U >= b)<br>
+    return 0;<br>
+  if (b > 0U)<br>
     return 0;<br>
   if (0U <= b)<br>
     return 0;<br>
+  if (b <= 0U)<br>
+    return 0;<br>
   if (0U > b)<br>
     return 0;<br>
+  if (b >= 0U)<br>
+    return 0;<br>
+  if (0U < b)<br>
+    return 0;<br>
<br>
   if (c < 0)<br>
     return 0;<br>
-  if (c >= 0)<br>
+  if (0 >= c) // expected-warning {{comparison 0 >= 'enum C' is always true}}<br>
+    return 0;<br>
+  if (c > 0) // expected-warning {{comparison 'enum C' > 0 is always false}}<br>
     return 0;<br>
   if (0 <= c)<br>
     return 0;<br>
+  if (c <= 0) // expected-warning {{comparison 'enum C' <= 0 is always true}}<br>
+    return 0;<br>
   if (0 > c)<br>
     return 0;<br>
+  if (c >= 0)<br>
+    return 0;<br>
+  if (0 < c) // expected-warning {{0 < 'enum C' is always false}}<br>
+    return 0;<br>
+<br>
   if (c < 0U)<br>
     return 0;<br>
-  if (c >= 0U)<br>
+  if (0U >= c)<br>
+    return 0;<br>
+  if (c > 0U)<br>
     return 0;<br>
   if (0U <= c)<br>
     return 0;<br>
+  if (c <= 0U)<br>
+    return 0;<br>
   if (0U > c)<br>
     return 0;<br>
+  if (c >= 0U)<br>
+    return 0;<br>
+  if (0U < c)<br>
+    return 0;<br>
+#endif<br>
+<br>
+  return 1;<br>
+}<br>
+<br>
+namespace crash_enum_zero_width {<br>
+int test() {<br>
+  enum A : unsigned {<br>
+    A_foo = 0<br>
+  };<br>
+  enum A a;<br>
+<br>
+  // used to crash in llvm::APSInt::getMaxValue()<br>
+#ifndef SILENCE<br>
+  if (a < 0) // expected-warning {{comparison of unsigned enum expression < 0 is always false}}<br>
+#else<br>
+  if (a > 0)<br>
 #endif<br>
+    return 0;<br>
<br>
   return 1;<br>
 }<br>
+} // namespace crash_enum_zero_width<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>