1 // RUN: %clang_cc1 -fsyntax-only \ 2 // RUN: -Wtautological-unsigned-zero-compare \ 3 // RUN: -verify %s 4 // RUN: %clang_cc1 -fsyntax-only \ 5 // RUN: -verify=silence %s 6 // RUN: %clang_cc1 -fsyntax-only \ 7 // RUN: -Wtautological-unsigned-zero-compare \ 8 // RUN: -verify -x c++ %s 9 // RUN: %clang_cc1 -fsyntax-only \ 10 // RUN: -verify=silence -x c++ %s 11 12 unsigned uvalue(void); 13 signed int svalue(void); 14 15 #define macro(val) val 16 17 #ifdef __cplusplus 18 template<typename T> TFunc()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 #endif 33 main()34int main() 35 { 36 #ifdef __cplusplus 37 TFunc<unsigned char>(); 38 TFunc<unsigned short>(); 39 #endif 40 41 short s = svalue(); 42 43 unsigned un = uvalue(); 44 45 // silence-no-diagnostics 46 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