1 // RUN: %clang_cc1 -fsyntax-only -Wparentheses -verify %s 2 3 struct A { 4 int foo(); 5 friend A operator+(const A&, const A&); 6 A operator|=(const A&); 7 operator bool(); 8 }; 9 10 void test() { 11 int x, *p; 12 A a, b; 13 14 // With scalars. 15 if (x = 7) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 16 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 17 // expected-note{{place parentheses around the assignment to silence this warning}} 18 if ((x = 7)) {} 19 do { 20 } while (x = 7); // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 21 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 22 // expected-note{{place parentheses around the assignment to silence this warning}} 23 do { 24 } while ((x = 7)); 25 while (x = 7) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 26 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 27 // expected-note{{place parentheses around the assignment to silence this warning}} 28 29 while ((x = 7)) {} 30 for (; x = 7; ) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 31 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 32 // expected-note{{place parentheses around the assignment to silence this warning}} 33 for (; (x = 7); ) {} 34 35 if (p = p) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 36 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 37 // expected-note{{place parentheses around the assignment to silence this warning}} 38 if ((p = p)) {} 39 do { 40 } while (p = p); // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 41 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 42 // expected-note{{place parentheses around the assignment to silence this warning}} 43 do { 44 } while ((p = p)); 45 while (p = p) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 46 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 47 // expected-note{{place parentheses around the assignment to silence this warning}} 48 while ((p = p)) {} 49 for (; p = p; ) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 50 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 51 // expected-note{{place parentheses around the assignment to silence this warning}} 52 for (; (p = p); ) {} 53 54 // Initializing variables (shouldn't warn). 55 if (int y = x) {} 56 while (int y = x) {} 57 if (A y = a) {} 58 while (A y = a) {} 59 60 // With temporaries. 61 if (x = (b+b).foo()) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 62 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 63 // expected-note{{place parentheses around the assignment to silence this warning}} 64 if ((x = (b+b).foo())) {} 65 do { 66 } while (x = (b+b).foo()); // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 67 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 68 // expected-note{{place parentheses around the assignment to silence this warning}} 69 do { 70 } while ((x = (b+b).foo())); 71 while (x = (b+b).foo()) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 72 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 73 // expected-note{{place parentheses around the assignment to silence this warning}} 74 while ((x = (b+b).foo())) {} 75 for (; x = (b+b).foo(); ) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 76 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 77 // expected-note{{place parentheses around the assignment to silence this warning}} 78 for (; (x = (b+b).foo()); ) {} 79 80 // With a user-defined operator. 81 if (a = b + b) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 82 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 83 // expected-note{{place parentheses around the assignment to silence this warning}} 84 if ((a = b + b)) {} 85 do { 86 } while (a = b + b); // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 87 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 88 // expected-note{{place parentheses around the assignment to silence this warning}} 89 do { 90 } while ((a = b + b)); 91 while (a = b + b) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 92 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 93 // expected-note{{place parentheses around the assignment to silence this warning}} 94 while ((a = b + b)) {} 95 for (; a = b + b; ) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 96 // expected-note{{use '==' to turn this assignment into an equality comparison}} \ 97 // expected-note{{place parentheses around the assignment to silence this warning}} 98 for (; (a = b + b); ) {} 99 100 // Compound assignments. 101 if (x |= 2) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 102 // expected-note{{use '!=' to turn this compound assignment into an inequality comparison}} \ 103 // expected-note{{place parentheses around the assignment to silence this warning}} 104 105 if (a |= b) {} // expected-warning {{using the result of an assignment as a condition without parentheses}} \ 106 // expected-note{{use '!=' to turn this compound assignment into an inequality comparison}} \ 107 // expected-note{{place parentheses around the assignment to silence this warning}} 108 109 if ((x == 5)) {} // expected-warning {{equality comparison with extraneous parentheses}} \ 110 // expected-note {{use '=' to turn this equality comparison into an assignment}} \ 111 // expected-note {{remove extraneous parentheses around the comparison to silence this warning}} 112 113 #pragma clang diagnostic push 114 #pragma clang diagnostic ignored "-Wparentheses-equality" 115 if ((x == 5)) {} // no-warning 116 #pragma clang diagnostic pop 117 118 if ((5 == x)) {} 119 120 #define EQ(x,y) ((x) == (y)) 121 if (EQ(x, 5)) {} 122 #undef EQ 123 } 124 125 void (*fn)(); 126 127 void test2() { 128 if ((fn == test2)) {} // expected-warning {{equality comparison with extraneous parentheses}} \ 129 // expected-note {{use '=' to turn this equality comparison into an assignment}} \ 130 // expected-note {{remove extraneous parentheses around the comparison to silence this warning}} 131 if ((test2 == fn)) {} 132 } 133 134 namespace rdar9027658 { 135 template <typename T> 136 void f(T t) { 137 if ((t.g == 3)) { } // expected-warning {{equality comparison with extraneous parentheses}} \ 138 // expected-note {{use '=' to turn this equality comparison into an assignment}} \ 139 // expected-note {{remove extraneous parentheses around the comparison to silence this warning}} 140 } 141 142 struct S { int g; }; 143 void test() { 144 f(S()); // expected-note {{in instantiation}} 145 } 146 } 147