Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / clang / test / SemaCXX / warn-assignment-condition.cpp
blob09084e36bb49169a71bd3fbd7e2942069f3cfe85
1 // RUN: %clang_cc1 -fsyntax-only -Wparentheses -verify %s
3 struct A {
4 int foo();
5 friend A operator+(const A&, const A&);
6 A operator|=(const A&);
7 operator bool();
8 };
10 void test() {
11 int x, *p;
12 A a, b;
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}}
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); ) {}
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); ) {}
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) {}
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()); ) {}
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); ) {}
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}}
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}}
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}}
113 #pragma clang diagnostic push
114 #pragma clang diagnostic ignored "-Wparentheses-equality"
115 if ((x == 5)) {} // no-warning
116 #pragma clang diagnostic pop
118 if ((5 == x)) {}
120 #define EQ(x,y) ((x) == (y))
121 if (EQ(x, 5)) {}
122 #undef EQ
125 void (*fn)();
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)) {}
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}}
142 struct S { int g; };
143 void test() {
144 f(S()); // expected-note {{in instantiation}}