// RUN: %clang_cc1 -fsyntax-only \ // RUN: -Wtautological-unsigned-zero-compare \ // RUN: -verify %s // RUN: %clang_cc1 -fsyntax-only \ // RUN: -verify=silence %s // RUN: %clang_cc1 -fsyntax-only \ // RUN: -Wtautological-unsigned-zero-compare \ // RUN: -verify -x c++ %s // RUN: %clang_cc1 -fsyntax-only \ // RUN: -verify=silence -x c++ %s unsigned uvalue(void); signed int svalue(void); #define macro(val) val #ifdef __cplusplus template void TFunc() { // Make sure that we do warn for normal variables in template functions ! unsigned char c = svalue(); if (c < 0) // expected-warning {{comparison of unsigned expression < 0 is always false}} return; if (c < macro(0)) return; T v = svalue(); if (v < 0) return; } #endif int main() { #ifdef __cplusplus TFunc(); TFunc(); #endif short s = svalue(); unsigned un = uvalue(); // silence-no-diagnostics // Note: both sides are promoted to unsigned long prior to the comparison. if (s == 0UL) return 0; if (s != 0UL) return 0; if (s < 0UL) // expected-warning {{comparison of unsigned expression < 0 is always false}} return 0; if (s <= 0UL) return 0; if (s > 0UL) return 0; if (s >= 0UL) // expected-warning {{comparison of unsigned expression >= 0 is always true}} return 0; if (0UL == s) return 0; if (0UL != s) return 0; if (0UL < s) return 0; if (0UL <= s) // expected-warning {{comparison of 0 <= unsigned expression is always true}} return 0; if (0UL > s) // expected-warning {{comparison of 0 > unsigned expression is always false}} return 0; if (0UL >= s) return 0; if (un == 0) return 0; if (un != 0) return 0; if (un < 0) // expected-warning {{comparison of unsigned expression < 0 is always false}} return 0; if (un <= 0) return 0; if (un > 0) return 0; if (un >= 0) // expected-warning {{comparison of unsigned expression >= 0 is always true}} return 0; if (0 == un) return 0; if (0 != un) return 0; if (0 < un) return 0; if (0 <= un) // expected-warning {{comparison of 0 <= unsigned expression is always true}} return 0; if (0 > un) // expected-warning {{comparison of 0 > unsigned expression is always false}} return 0; if (0 >= un) return 0; if (un == 0UL) return 0; if (un != 0UL) return 0; if (un < 0UL) // expected-warning {{comparison of unsigned expression < 0 is always false}} return 0; if (un <= 0UL) return 0; if (un > 0UL) return 0; if (un >= 0UL) // expected-warning {{comparison of unsigned expression >= 0 is always true}} return 0; if (0UL == un) return 0; if (0UL != un) return 0; if (0UL < un) return 0; if (0UL <= un) // expected-warning {{comparison of 0 <= unsigned expression is always true}} return 0; if (0UL > un) // expected-warning {{comparison of 0 > unsigned expression is always false}} return 0; if (0UL >= un) return 0; signed int a = svalue(); if (a == 0) return 0; if (a != 0) return 0; if (a < 0) return 0; if (a <= 0) return 0; if (a > 0) return 0; if (a >= 0) return 0; if (0 == a) return 0; if (0 != a) return 0; if (0 < a) return 0; if (0 <= a) return 0; if (0 > a) return 0; if (0 >= a) return 0; if (a == 0UL) return 0; if (a != 0UL) return 0; if (a < 0UL) // expected-warning {{comparison of unsigned expression < 0 is always false}} return 0; if (a <= 0UL) return 0; if (a > 0UL) return 0; if (a >= 0UL) // expected-warning {{comparison of unsigned expression >= 0 is always true}} return 0; if (0UL == a) return 0; if (0UL != a) return 0; if (0UL < a) return 0; if (0UL <= a) // expected-warning {{comparison of 0 <= unsigned expression is always true}} return 0; if (0UL > a) // expected-warning {{comparison of 0 > unsigned expression is always false}} return 0; if (0UL >= a) return 0; float fl = 0; if (fl == 0) return 0; if (fl != 0) return 0; if (fl < 0) return 0; if (fl <= 0) return 0; if (fl > 0) return 0; if (fl >= 0) return 0; if (0 == fl) return 0; if (0 != fl) return 0; if (0 < fl) return 0; if (0 <= fl) return 0; if (0 > fl) return 0; if (0 >= fl) return 0; if (fl == 0UL) return 0; if (fl != 0UL) return 0; if (fl < 0UL) return 0; if (fl <= 0UL) return 0; if (fl > 0UL) return 0; if (fl >= 0UL) return 0; if (0UL == fl) return 0; if (0UL != fl) return 0; if (0UL < fl) return 0; if (0UL <= fl) return 0; if (0UL > fl) return 0; if (0UL >= fl) return 0; double dl = 0; if (dl == 0) return 0; if (dl != 0) return 0; if (dl < 0) return 0; if (dl <= 0) return 0; if (dl > 0) return 0; if (dl >= 0) return 0; if (0 == dl) return 0; if (0 != dl) return 0; if (0 < dl) return 0; if (0 <= dl) return 0; if (0 > dl) return 0; if (0 >= dl) return 0; if (dl == 0UL) return 0; if (dl != 0UL) return 0; if (dl < 0UL) return 0; if (dl <= 0UL) return 0; if (dl > 0UL) return 0; if (dl >= 0UL) return 0; if (0UL == dl) return 0; if (0UL != dl) return 0; if (0UL < dl) return 0; if (0UL <= dl) return 0; if (0UL > dl) return 0; if (0UL >= dl) return 0; return 1; }