r319875 - Fix a bunch of wrong "tautological unsigned enum compare" diagnostics in C++.

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 11 10:59:24 PST 2017


I've committed a fix to pacify the test in r320405.

On Wed, Dec 6, 2017 at 12:27 PM, Galina Kistanova via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Hello Richard,
>
> This commit broke the tests on the builder:
>
> http://lab.llvm.org:8011/builders/llvm-clang-x86_64-
> expensive-checks-win/builds/6598
>
> . . .
> Failing Tests (1):
>     Clang :: SemaCXX/warn-enum-compare.cpp
>
> Please have a look?
>
> Thanks
>
> Galina
>
> On Tue, Dec 5, 2017 at 7:00 PM, Richard Smith via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: rsmith
>> Date: Tue Dec  5 19:00:51 2017
>> New Revision: 319875
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=319875&view=rev
>> Log:
>> Fix a bunch of wrong "tautological unsigned enum compare" diagnostics in
>> C++.
>>
>> An enumeration with a fixed underlying type can have any value in its
>> underlying type, not just those spanned by the values of its enumerators.
>>
>> Modified:
>>     cfe/trunk/lib/Sema/SemaChecking.cpp
>>     cfe/trunk/test/Sema/tautological-unsigned-enum-zero-compare.cpp
>>
>> Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaC
>> hecking.cpp?rev=319875&r1=319874&r2=319875&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaChecking.cpp Tue Dec  5 19:00:51 2017
>> @@ -8260,11 +8260,12 @@ struct IntRange {
>>      } else if (const EnumType *ET = dyn_cast<EnumType>(T)) {
>>        // For enum types in C++, use the known bit width of the
>> enumerators.
>>        EnumDecl *Enum = ET->getDecl();
>> -      // In C++11, enums without definitions can have an explicitly
>> specified
>> -      // underlying type.  Use this type to compute the range.
>> -      if (!Enum->isCompleteDefinition())
>> +      // In C++11, enums can have a fixed underlying type. Use this type
>> to
>> +      // compute the range.
>> +      if (Enum->isFixed()) {
>>          return IntRange(C.getIntWidth(QualType(T, 0)),
>>                          !ET->isSignedIntegerOrEnumerationType());
>> +      }
>>
>>        unsigned NumPositive = Enum->getNumPositiveBits();
>>        unsigned NumNegative = Enum->getNumNegativeBits();
>>
>> Modified: cfe/trunk/test/Sema/tautological-unsigned-enum-zero-compare.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/taut
>> ological-unsigned-enum-zero-compare.cpp?rev=319875&r1=
>> 319874&r2=319875&view=diff
>> ============================================================
>> ==================
>> --- cfe/trunk/test/Sema/tautological-unsigned-enum-zero-compare.cpp
>> (original)
>> +++ cfe/trunk/test/Sema/tautological-unsigned-enum-zero-compare.cpp Tue
>> Dec  5 19:00:51 2017
>> @@ -2,11 +2,11 @@
>>  // RUN: %clang_cc1 -std=c++11 -triple=x86_64-pc-win32 -fsyntax-only
>> -DSIGNED -verify %s
>>  // RUN: %clang_cc1 -std=c++11 -triple=x86_64-pc-win32 -fsyntax-only
>> -DSILENCE -Wno-tautological-unsigned-enum-zero-compare -verify %s
>>
>> -// Okay, this is where it gets complicated.
>> -// Then default enum sigdness is target-specific.
>> -// On windows, it is signed by default. We do not want to warn in that
>> case.
>> -
>>  int main() {
>> +  // On Windows, all enumerations have a fixed underlying type, which is
>> 'int'
>> +  // if not otherwise specified, so A is identical to C on Windows.
>> Otherwise,
>> +  // we follow the C++ rules, which say that the only valid values of A
>> are 0
>> +  // and 1.
>>    enum A { A_foo = 0, A_bar, };
>>    enum A a;
>>
>> @@ -87,21 +87,23 @@ int main() {
>>
>>    if (c < 0)
>>      return 0;
>> -  if (0 >= c) // expected-warning {{comparison 0 >= 'enum C' is always
>> true}}
>> +  if (0 >= c)
>>      return 0;
>> -  if (c > 0) // expected-warning {{comparison 'enum C' > 0 is always
>> false}}
>> +  if (c > 0)
>>      return 0;
>>    if (0 <= c)
>>      return 0;
>> -  if (c <= 0) // expected-warning {{comparison 'enum C' <= 0 is always
>> true}}
>> +  if (c <= 0)
>>      return 0;
>>    if (0 > c)
>>      return 0;
>>    if (c >= 0)
>>      return 0;
>> -  if (0 < c) // expected-warning {{0 < 'enum C' is always false}}
>> +  if (0 < c)
>>      return 0;
>>
>> +  // FIXME: These diagnostics are terrible. The issue here is that the
>> signed
>> +  // enumeration value was promoted to an unsigned type.
>>    if (c < 0U) // expected-warning {{comparison of unsigned enum
>> expression < 0 is always false}}
>>      return 0;
>>    if (0U >= c)
>> @@ -121,21 +123,23 @@ int main() {
>>  #elif defined(SIGNED)
>>    if (a < 0)
>>      return 0;
>> -  if (0 >= a) // expected-warning {{comparison 0 >= 'enum A' is always
>> true}}
>> +  if (0 >= a)
>>      return 0;
>> -  if (a > 0) // expected-warning {{comparison 'enum A' > 0 is always
>> false}}
>> +  if (a > 0)
>>      return 0;
>>    if (0 <= a)
>>      return 0;
>> -  if (a <= 0) // expected-warning {{comparison 'enum A' <= 0 is always
>> true}}
>> +  if (a <= 0)
>>      return 0;
>>    if (0 > a)
>>      return 0;
>>    if (a >= 0)
>>      return 0;
>> -  if (0 < a) // expected-warning {{comparison 0 < 'enum A' is always
>> false}}
>> +  if (0 < a)
>>      return 0;
>>
>> +  // FIXME: As above, the issue here is that the enumeration is promoted
>> to
>> +  // unsigned.
>>    if (a < 0U) // expected-warning {{comparison of unsigned enum
>> expression < 0 is always false}}
>>      return 0;
>>    if (0U >= a)
>> @@ -189,19 +193,19 @@ int main() {
>>
>>    if (c < 0)
>>      return 0;
>> -  if (0 >= c) // expected-warning {{comparison 0 >= 'enum C' is always
>> true}}
>> +  if (0 >= c)
>>      return 0;
>> -  if (c > 0) // expected-warning {{comparison 'enum C' > 0 is always
>> false}}
>> +  if (c > 0)
>>      return 0;
>>    if (0 <= c)
>>      return 0;
>> -  if (c <= 0) // expected-warning {{comparison 'enum C' <= 0 is always
>> true}}
>> +  if (c <= 0)
>>      return 0;
>>    if (0 > c)
>>      return 0;
>>    if (c >= 0)
>>      return 0;
>> -  if (0 < c) // expected-warning {{0 < 'enum C' is always false}}
>> +  if (0 < c)
>>      return 0;
>>
>>    if (c < 0U) // expected-warning {{comparison of unsigned enum
>> expression < 0 is always false}}
>> @@ -221,21 +225,22 @@ int main() {
>>    if (0U < c)
>>      return 0;
>>  #else
>> +  // expected-no-diagnostics
>>    if (a < 0)
>>      return 0;
>> -  if (0 >= a) // expected-warning {{comparison 0 >= 'enum A' is always
>> true}}
>> +  if (0 >= a)
>>      return 0;
>> -  if (a > 0) // expected-warning {{comparison 'enum A' > 0 is always
>> false}}
>> +  if (a > 0)
>>      return 0;
>>    if (0 <= a)
>>      return 0;
>> -  if (a <= 0) // expected-warning {{comparison 'enum A' <= 0 is always
>> true}}
>> +  if (a <= 0)
>>      return 0;
>>    if (0 > a)
>>      return 0;
>>    if (a >= 0)
>>      return 0;
>> -  if (0 < a) // expected-warning {{comparison 0 < 'enum A' is always
>> false}}
>> +  if (0 < a)
>>      return 0;
>>
>>    if (a < 0U)
>> @@ -291,19 +296,19 @@ int main() {
>>
>>    if (c < 0)
>>      return 0;
>> -  if (0 >= c) // expected-warning {{comparison 0 >= 'enum C' is always
>> true}}
>> +  if (0 >= c)
>>      return 0;
>> -  if (c > 0) // expected-warning {{comparison 'enum C' > 0 is always
>> false}}
>> +  if (c > 0)
>>      return 0;
>>    if (0 <= c)
>>      return 0;
>> -  if (c <= 0) // expected-warning {{comparison 'enum C' <= 0 is always
>> true}}
>> +  if (c <= 0)
>>      return 0;
>>    if (0 > c)
>>      return 0;
>>    if (c >= 0)
>>      return 0;
>> -  if (0 < c) // expected-warning {{0 < 'enum C' is always false}}
>> +  if (0 < c)
>>      return 0;
>>
>>    if (c < 0U)
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171211/14011181/attachment.html>


More information about the cfe-commits mailing list