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@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@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@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits