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

Galina Kistanova via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 11 13:33:57 PST 2017


Hans,

Thank you for fixing the test!

Thanks

Galina


On Mon, Dec 11, 2017 at 10:59 AM, Hans Wennborg <hans at chromium.org> wrote:

> 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-expensiv
>> e-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/5a32243e/attachment.html>


More information about the cfe-commits mailing list