1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 3 4 void f(int x, int y, int z) { 5 6 bool a,b; 7 8 if(b > true) {} // expected-warning {{comparison of true with expression of type 'bool' is always false}} 9 if(b < true) {} // no warning 10 if(b >= true) {} // no warning 11 if(b <= true) {} // expected-warning {{comparison of true with expression of type 'bool' is always true}} 12 if(b == true) {} // no warning 13 if(b != true) {} // no warning 14 15 if(b > false) {} // no warning 16 if(b < false) {} // expected-warning {{comparison of false with expression of type 'bool' is always false}} 17 if(b >= false) {} // expected-warning {{comparison of false with expression of type 'bool' is always true}} 18 if(b <= false) {} // no warning 19 if(b == false) {} // no warning 20 if(b != false) {} // no warning 21 22 if(b > 1U){} // expected-warning {{comparison of constant 1 with expression of type 'bool' is always false}} 23 24 if (a > b) {} // no warning 25 if (a < b) {} // no warning 26 if (a >= b) {} // no warning 27 if (a <= b) {} // no warning 28 if (a == b) {} // no warning 29 if (a != b) {} // no warning 30 31 if (a > 0) {} // no warning 32 if (a > 1) {} // expected-warning {{comparison of constant 1 with expression of type 'bool' is always false}} 33 if (a > 2) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always false}} 34 35 if (a >= 0) {} // expected-warning {{comparison of constant 0 with expression of type 'bool' is always true}} 36 if (a >= 1) {} // no warning 37 if (a >= 2) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always false}} 38 if (a >= -1) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always true}} 39 40 if (a <= 0) {} // no warning 41 if (a <= 1) {} // expected-warning {{comparison of constant 1 with expression of type 'bool' is always true}} 42 if (a <= 2) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always true}} 43 if (a <= -1) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always false}} 44 45 if (!a > 0) {} // no warning 46 if (!a > 1) {} // expected-warning {{comparison of constant 1 with expression of type 'bool' is always false}} 47 if (!a > 2) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always false}} 48 if (!a > y) {} // no warning 49 if (!a > b) {} // no warning 50 if (!a > -1) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always true}} 51 52 if (!a < 0) {} // expected-warning {{comparison of constant 0 with expression of type 'bool' is always false}} 53 if (!a < 1) {} // no warning 54 if (!a < 2) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always true}} 55 if (!a < y) {} // no warning 56 if (!a < b) {} // no warning 57 if (!a < -1) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always false}} 58 59 if (!a >= 0) {} // expected-warning {{comparison of constant 0 with expression of type 'bool' is always true}} 60 if (!a >= 1) {} // no warning 61 if (!a >= 2) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always false}} 62 if (!a >= y) {} // no warning 63 if (!a >= b) {} // no warning 64 if (!a >= -1) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always true}} 65 66 if (!a <= 0) {} // no warning 67 if (!a <= 1) {} // expected-warning {{comparison of constant 1 with expression of type 'bool' is always true}} 68 if (!a <= 2) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always true}} 69 if (!a <= y) {} // no warning 70 if (!a <= b) {} // no warning 71 if (!a <= -1) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always false}} 72 73 if ((a||b) > 0) {} // no warning 74 if ((a||b) > 1) {} // expected-warning {{comparison of constant 1 with expression of type 'bool' is always false}} 75 if ((a||b) > 4) {} // expected-warning {{comparison of constant 4 with expression of type 'bool' is always false}} 76 if ((a||b) > -1) {}// expected-warning {{comparison of constant -1 with expression of type 'bool' is always true}} 77 78 if ((a&&b) > 0) {} // no warning 79 if ((a&&b) > 1) {} // expected-warning {{comparison of constant 1 with expression of type 'bool' is always false}} 80 if ((a&&b) > 4) {} // expected-warning {{comparison of constant 4 with expression of type 'bool' is always false}} 81 82 if ((a<y) > 0) {} // no warning 83 if ((a<y) > 1) {} // expected-warning {{comparison of constant 1 with expression of type 'bool' is always false}} 84 if ((a<y) > 4) {} // expected-warning {{comparison of constant 4 with expression of type 'bool' is always false}} 85 if ((a<y) > z) {} // no warning 86 if ((a<y) > -1) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always true}} 87 88 if ((a<y) == 0) {} // no warning 89 if ((a<y) == 1) {} // no warning 90 if ((a<y) == 2) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always false}} 91 if ((a<y) == z) {} // no warning 92 if ((a<y) == -1) {}// expected-warning {{comparison of constant -1 with expression of type 'bool' is always false}} 93 94 if ((a<y) != 0) {} // no warning 95 if ((a<y) != 1) {} // no warning 96 if ((a<y) != 2) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always true}} 97 if ((a<y) != z) {} // no warning 98 if ((a<y) != -1) {}// expected-warning {{comparison of constant -1 with expression of type 'bool' is always true}} 99 100 if ((a<y) == z) {} // no warning 101 if (a>y<z) {} // no warning 102 if ((a<y) > z) {} // no warning 103 if((a<y)>(z<y)) {} // no warning 104 if((a<y)==(z<y)){} // no warning 105 if((a<y)!=(z<y)){} // no warning 106 if((z==x)<(y==z)){} // no warning 107 if((a<y)!=((z==x)<(y==z))){} // no warning 108 109 110 if (0 > !a) {} // expected-warning {{comparison of constant 0 with expression of type 'bool' is always false}} 111 if (1 > !a) {} // no warning 112 if (2 > !a) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always true}} 113 if (y > !a) {} // no warning 114 if (-1 > !a) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always false}} 115 116 if (0 < !a) {} // no warning 117 if (1 < !a) {} // expected-warning {{comparison of constant 1 with expression of type 'bool' is always false}} 118 if (2 < !a) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always false}} 119 if (y < !a) {} // no warning 120 if (-1 < !a) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always true}} 121 122 123 if (0 >= !a) {} // no warning 124 if (1 >= !a) {} // expected-warning {{comparison of constant 1 with expression of type 'bool' is always true}} 125 if (2 >= !a) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always true}} 126 if (y >= !a) {} // no warning 127 if (-1 >= !a) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always false}} 128 129 if (0 <= !a) {} // expected-warning {{comparison of constant 0 with expression of type 'bool' is always true}} 130 if (1 <= !a) {} // no warning 131 if (2 <= !a) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always false}} 132 if (y <= !a) {} // 133 if (-1 <= !a) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always true}} 134 135 if (0 > (a||b)) {} // expected-warning {{comparison of constant 0 with expression of type 'bool' is always false}} 136 if (1 > (a||b)) {} // no warning 137 if (4 > (a||b)) {} // expected-warning {{comparison of constant 4 with expression of type 'bool' is always true}} 138 139 if (0 > (a&&b)) {} // expected-warning {{comparison of constant 0 with expression of type 'bool' is always false}} 140 if (1 > (a&&b)) {} // no warning 141 if (4 > (a&&b)) {} // expected-warning {{comparison of constant 4 with expression of type 'bool' is always true}} 142 143 if (0 > (a<y)) {} // expected-warning {{comparison of constant 0 with expression of type 'bool' is always false}} 144 if (1 > (a<y)) {} // no warning 145 if (4 > (a<y)) {} // expected-warning {{comparison of constant 4 with expression of type 'bool' is always true}} 146 if (z > (a<y)) {} // 147 if (-1 > (a<y)) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always false}} 148 149 if (0 == (a<y)) {} // no warning 150 if (1 == (a<y)) {} // no warning 151 if (2 == (a<y)) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always false}} 152 if (z == (a<y)) {} // no warning 153 if (-1 == (a<y)){} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always false}} 154 155 if (0 !=(a<y)) {} // no warning 156 if (1 !=(a<y)) {} // no warning 157 if (2 !=(a<y)) {} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always true}} 158 if (z !=(a<y)) {} // no warning 159 if (-1 !=(a<y)) {} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always true}} 160 161 if (z ==(a<y)) {} // no warning 162 if (z<a>y) {} // no warning 163 if (z > (a<y)) {} // no warning 164 if((z<y)>(a<y)) {} // no warning 165 if((z<y)==(a<y)){} // no warning 166 if((z<y)!=(a<y)){} // no warning 167 if((y==z)<(z==x)){} // no warning 168 if(((z==x)<(y==z))!=(a<y)){} // no warning 169 170 if(((z==x)<(-1==z))!=(a<y)){} // no warning 171 if(((z==x)<(z==-1))!=(a<y)){} // no warning 172 if(((z==x)<-1)!=(a<y)){} // expected-warning {{comparison of constant -1 with expression of type 'bool' is always false}} 173 if(((z==x)< 2)!=(a<y)){} // expected-warning {{comparison of constant 2 with expression of type 'bool' is always true}} 174 if(((z==x)<(z>2))!=(a<y)){} // no warning 175 176 } 177 178 179 template<typename T, typename U, typename V> struct X6 { 180 U f(T t, U u, V v) { 181 // IfStmt 182 if (t > 0) 183 return u; 184 else { 185 if (t < 0) 186 return v; // expected-error{{cannot initialize return object of type}} 187 } 188 bool r; 189 // FIXME: We should warn here, DiagRuntimeBehavior does currently not detect this. 190 if(r<0){} 191 192 if (T x = t) { 193 t = x; 194 } 195 return v; // expected-error{{cannot initialize return object of type}} 196 } 197 }; 198 199 struct ConvertibleToInt { 200 operator int() const; 201 }; 202 203 template struct X6<ConvertibleToInt, float, char>; 204 template struct X6<bool, int, int*>; // expected-note{{instantiation}} 205 206 207 208