293 lines · c
1// RUN: %clang_cc1 -fsyntax-only \2// RUN: -Wtautological-unsigned-zero-compare \3// RUN: -verify %s4// RUN: %clang_cc1 -fsyntax-only \5// RUN: -verify=silence %s6// RUN: %clang_cc1 -fsyntax-only \7// RUN: -Wtautological-unsigned-zero-compare \8// RUN: -verify -x c++ %s9// RUN: %clang_cc1 -fsyntax-only \10// RUN: -verify=silence -x c++ %s11 12unsigned uvalue(void);13signed int svalue(void);14 15#define macro(val) val16 17#ifdef __cplusplus18template<typename T>19void TFunc() {20 // Make sure that we do warn for normal variables in template functions !21 unsigned char c = svalue();22 if (c < 0) // expected-warning {{comparison of unsigned expression < 0 is always false}}23 return;24 25 if (c < macro(0))26 return;27 28 T v = svalue();29 if (v < 0)30 return;31}32#endif33 34int main(void)35{36#ifdef __cplusplus37 TFunc<unsigned char>();38 TFunc<unsigned short>();39#endif40 41 short s = svalue();42 43 unsigned un = uvalue();44 45 // silence-no-diagnostics46 47 // Note: both sides are promoted to unsigned long prior to the comparison.48 if (s == 0UL)49 return 0;50 if (s != 0UL)51 return 0;52 if (s < 0UL) // expected-warning {{comparison of unsigned expression < 0 is always false}}53 return 0;54 if (s <= 0UL)55 return 0;56 if (s > 0UL)57 return 0;58 if (s >= 0UL) // expected-warning {{comparison of unsigned expression >= 0 is always true}}59 return 0;60 61 if (0UL == s)62 return 0;63 if (0UL != s)64 return 0;65 if (0UL < s)66 return 0;67 if (0UL <= s) // expected-warning {{comparison of 0 <= unsigned expression is always true}}68 return 0;69 if (0UL > s) // expected-warning {{comparison of 0 > unsigned expression is always false}}70 return 0;71 if (0UL >= s)72 return 0;73 74 if (un == 0)75 return 0;76 if (un != 0)77 return 0;78 if (un < 0) // expected-warning {{comparison of unsigned expression < 0 is always false}}79 return 0;80 if (un <= 0)81 return 0;82 if (un > 0)83 return 0;84 if (un >= 0) // expected-warning {{comparison of unsigned expression >= 0 is always true}}85 return 0;86 87 if (0 == un)88 return 0;89 if (0 != un)90 return 0;91 if (0 < un)92 return 0;93 if (0 <= un) // expected-warning {{comparison of 0 <= unsigned expression is always true}}94 return 0;95 if (0 > un) // expected-warning {{comparison of 0 > unsigned expression is always false}}96 return 0;97 if (0 >= un)98 return 0;99 100 if (un == 0UL)101 return 0;102 if (un != 0UL)103 return 0;104 if (un < 0UL) // expected-warning {{comparison of unsigned expression < 0 is always false}}105 return 0;106 if (un <= 0UL)107 return 0;108 if (un > 0UL)109 return 0;110 if (un >= 0UL) // expected-warning {{comparison of unsigned expression >= 0 is always true}}111 return 0;112 113 if (0UL == un)114 return 0;115 if (0UL != un)116 return 0;117 if (0UL < un)118 return 0;119 if (0UL <= un) // expected-warning {{comparison of 0 <= unsigned expression is always true}}120 return 0;121 if (0UL > un) // expected-warning {{comparison of 0 > unsigned expression is always false}}122 return 0;123 if (0UL >= un)124 return 0;125 126 127 signed int a = svalue();128 129 if (a == 0)130 return 0;131 if (a != 0)132 return 0;133 if (a < 0)134 return 0;135 if (a <= 0)136 return 0;137 if (a > 0)138 return 0;139 if (a >= 0)140 return 0;141 142 if (0 == a)143 return 0;144 if (0 != a)145 return 0;146 if (0 < a)147 return 0;148 if (0 <= a)149 return 0;150 if (0 > a)151 return 0;152 if (0 >= a)153 return 0;154 155 if (a == 0UL)156 return 0;157 if (a != 0UL)158 return 0;159 if (a < 0UL) // expected-warning {{comparison of unsigned expression < 0 is always false}}160 return 0;161 if (a <= 0UL)162 return 0;163 if (a > 0UL)164 return 0;165 if (a >= 0UL) // expected-warning {{comparison of unsigned expression >= 0 is always true}}166 return 0;167 168 if (0UL == a)169 return 0;170 if (0UL != a)171 return 0;172 if (0UL < a)173 return 0;174 if (0UL <= a) // expected-warning {{comparison of 0 <= unsigned expression is always true}}175 return 0;176 if (0UL > a) // expected-warning {{comparison of 0 > unsigned expression is always false}}177 return 0;178 if (0UL >= a)179 return 0;180 181 182 float fl = 0;183 184 if (fl == 0)185 return 0;186 if (fl != 0)187 return 0;188 if (fl < 0)189 return 0;190 if (fl <= 0)191 return 0;192 if (fl > 0)193 return 0;194 if (fl >= 0)195 return 0;196 197 if (0 == fl)198 return 0;199 if (0 != fl)200 return 0;201 if (0 < fl)202 return 0;203 if (0 <= fl)204 return 0;205 if (0 > fl)206 return 0;207 if (0 >= fl)208 return 0;209 210 if (fl == 0UL)211 return 0;212 if (fl != 0UL)213 return 0;214 if (fl < 0UL)215 return 0;216 if (fl <= 0UL)217 return 0;218 if (fl > 0UL)219 return 0;220 if (fl >= 0UL)221 return 0;222 223 if (0UL == fl)224 return 0;225 if (0UL != fl)226 return 0;227 if (0UL < fl)228 return 0;229 if (0UL <= fl)230 return 0;231 if (0UL > fl)232 return 0;233 if (0UL >= fl)234 return 0;235 236 237 double dl = 0;238 239 if (dl == 0)240 return 0;241 if (dl != 0)242 return 0;243 if (dl < 0)244 return 0;245 if (dl <= 0)246 return 0;247 if (dl > 0)248 return 0;249 if (dl >= 0)250 return 0;251 252 if (0 == dl)253 return 0;254 if (0 != dl)255 return 0;256 if (0 < dl)257 return 0;258 if (0 <= dl)259 return 0;260 if (0 > dl)261 return 0;262 if (0 >= dl)263 return 0;264 265 if (dl == 0UL)266 return 0;267 if (dl != 0UL)268 return 0;269 if (dl < 0UL)270 return 0;271 if (dl <= 0UL)272 return 0;273 if (dl > 0UL)274 return 0;275 if (dl >= 0UL)276 return 0;277 278 if (0UL == dl)279 return 0;280 if (0UL != dl)281 return 0;282 if (0UL < dl)283 return 0;284 if (0UL <= dl)285 return 0;286 if (0UL > dl)287 return 0;288 if (0UL >= dl)289 return 0;290 291 return 1;292}293