1 // RUN: %clang_cc1 -fsyntax-only -Wlogical-not-parentheses -verify %s
2 // RUN: %clang_cc1 -fsyntax-only -Wlogical-not-parentheses -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
3
4 bool getBool();
5 int getInt();
6
test1(int i1,int i2,bool b1,bool b2)7 bool test1(int i1, int i2, bool b1, bool b2) {
8 bool ret;
9
10 ret = !i1 == i2;
11 // expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
12 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
13 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
14 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:9: warning
15 // CHECK: to evaluate the comparison first
16 // CHECK: fix-it:"{{.*}}":{[[line]]:10-[[line]]:10}:"("
17 // CHECK: fix-it:"{{.*}}":{[[line]]:18-[[line]]:18}:")"
18 // CHECK: to silence this warning
19 // CHECK: fix-it:"{{.*}}":{[[line]]:9-[[line]]:9}:"("
20 // CHECK: fix-it:"{{.*}}":{[[line]]:12-[[line]]:12}:")"
21
22 ret = !i1 != i2;
23 //expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
24 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
25 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
26 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:9: warning
27 // CHECK: to evaluate the comparison first
28 // CHECK: fix-it:"{{.*}}":{[[line]]:10-[[line]]:10}:"("
29 // CHECK: fix-it:"{{.*}}":{[[line]]:18-[[line]]:18}:")"
30 // CHECK: to silence this warning
31 // CHECK: fix-it:"{{.*}}":{[[line]]:9-[[line]]:9}:"("
32 // CHECK: fix-it:"{{.*}}":{[[line]]:12-[[line]]:12}:")"
33
34 ret = !i1 < i2;
35 //expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
36 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
37 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
38 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:9: warning
39 // CHECK: to evaluate the comparison first
40 // CHECK: fix-it:"{{.*}}":{[[line]]:10-[[line]]:10}:"("
41 // CHECK: fix-it:"{{.*}}":{[[line]]:17-[[line]]:17}:")"
42 // CHECK: to silence this warning
43 // CHECK: fix-it:"{{.*}}":{[[line]]:9-[[line]]:9}:"("
44 // CHECK: fix-it:"{{.*}}":{[[line]]:12-[[line]]:12}:")"
45
46 ret = !i1 > i2;
47 //expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
48 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
49 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
50 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:9: warning
51 // CHECK: to evaluate the comparison first
52 // CHECK: fix-it:"{{.*}}":{[[line]]:10-[[line]]:10}:"("
53 // CHECK: fix-it:"{{.*}}":{[[line]]:17-[[line]]:17}:")"
54 // CHECK: to silence this warning
55 // CHECK: fix-it:"{{.*}}":{[[line]]:9-[[line]]:9}:"("
56 // CHECK: fix-it:"{{.*}}":{[[line]]:12-[[line]]:12}:")"
57
58 ret = !i1 <= i2;
59 //expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
60 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
61 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
62 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:9: warning
63 // CHECK: to evaluate the comparison first
64 // CHECK: fix-it:"{{.*}}":{[[line]]:10-[[line]]:10}:"("
65 // CHECK: fix-it:"{{.*}}":{[[line]]:18-[[line]]:18}:")"
66 // CHECK: to silence this warning
67 // CHECK: fix-it:"{{.*}}":{[[line]]:9-[[line]]:9}:"("
68 // CHECK: fix-it:"{{.*}}":{[[line]]:12-[[line]]:12}:")"
69
70 ret = !i1 >= i2;
71 //expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
72 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
73 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
74 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:9: warning
75 // CHECK: to evaluate the comparison first
76 // CHECK: fix-it:"{{.*}}":{[[line]]:10-[[line]]:10}:"("
77 // CHECK: fix-it:"{{.*}}":{[[line]]:18-[[line]]:18}:")"
78 // CHECK: to silence this warning
79 // CHECK: fix-it:"{{.*}}":{[[line]]:9-[[line]]:9}:"("
80 // CHECK: fix-it:"{{.*}}":{[[line]]:12-[[line]]:12}:")"
81
82 ret = i1 == i2;
83 ret = i1 != i2;
84 ret = i1 < i2;
85 ret = i1 > i2;
86 ret = i1 <= i2;
87 ret = i1 >= i2;
88
89 // Warning silenced by parens.
90 ret = (!i1) == i2;
91 ret = (!i1) != i2;
92 ret = (!i1) < i2;
93 ret = (!i1) > i2;
94 ret = (!i1) <= i2;
95 ret = (!i1) >= i2;
96
97 ret = !b1 == b2;
98 ret = !b1 != b2;
99 ret = !b1 < b2;
100 ret = !b1 > b2;
101 ret = !b1 <= b2;
102 ret = !b1 >= b2;
103
104 ret = !getInt() == i1;
105 // expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
106 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
107 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
108 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:9: warning
109 // CHECK: to evaluate the comparison first
110 // CHECK: fix-it:"{{.*}}":{[[line]]:10-[[line]]:10}:"("
111 // CHECK: fix-it:"{{.*}}":{[[line]]:24-[[line]]:24}:")"
112 // CHECK: to silence this warning
113 // CHECK: fix-it:"{{.*}}":{[[line]]:9-[[line]]:9}:"("
114 // CHECK: fix-it:"{{.*}}":{[[line]]:18-[[line]]:18}:")"
115
116 ret = (!getInt()) == i1;
117 ret = !getBool() == b1;
118 return ret;
119 }
120
121 enum E {e1, e2};
122 E getE();
123
test2(E e)124 bool test2 (E e) {
125 bool ret;
126 ret = e == e1;
127 ret = e == getE();
128 ret = getE() == e1;
129 ret = getE() == getE();
130
131 ret = !e == e1;
132 // expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
133 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
134 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
135 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:9: warning
136 // CHECK: to evaluate the comparison first
137 // CHECK: fix-it:"{{.*}}":{[[line]]:10-[[line]]:10}:"("
138 // CHECK: fix-it:"{{.*}}":{[[line]]:17-[[line]]:17}:")"
139 // CHECK: to silence this warning
140 // CHECK: fix-it:"{{.*}}":{[[line]]:9-[[line]]:9}:"("
141 // CHECK: fix-it:"{{.*}}":{[[line]]:11-[[line]]:11}:")"
142
143 ret = !e == getE();
144 // expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
145 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
146 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
147 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:9: warning
148 // CHECK: to evaluate the comparison first
149 // CHECK: fix-it:"{{.*}}":{[[line]]:10-[[line]]:10}:"("
150 // CHECK: fix-it:"{{.*}}":{[[line]]:21-[[line]]:21}:")"
151 // CHECK: to silence this warning
152 // CHECK: fix-it:"{{.*}}":{[[line]]:9-[[line]]:9}:"("
153 // CHECK: fix-it:"{{.*}}":{[[line]]:11-[[line]]:11}:")"
154
155 ret = !getE() == e1;
156 // expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
157 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
158 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
159 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:9: warning
160 // CHECK: to evaluate the comparison first
161 // CHECK: fix-it:"{{.*}}":{[[line]]:10-[[line]]:10}:"("
162 // CHECK: fix-it:"{{.*}}":{[[line]]:22-[[line]]:22}:")"
163 // CHECK: to silence this warning
164 // CHECK: fix-it:"{{.*}}":{[[line]]:9-[[line]]:9}:"("
165 // CHECK: fix-it:"{{.*}}":{[[line]]:16-[[line]]:16}:")"
166
167 ret = !getE() == getE();
168 // expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
169 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
170 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
171 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:9: warning
172 // CHECK: to evaluate the comparison first
173 // CHECK: fix-it:"{{.*}}":{[[line]]:10-[[line]]:10}:"("
174 // CHECK: fix-it:"{{.*}}":{[[line]]:26-[[line]]:26}:")"
175 // CHECK: to silence this warning
176 // CHECK: fix-it:"{{.*}}":{[[line]]:9-[[line]]:9}:"("
177 // CHECK: fix-it:"{{.*}}":{[[line]]:16-[[line]]:16}:")"
178
179 ret = !(e == e1);
180 ret = !(e == getE());
181 ret = !(getE() == e1);
182 ret = !(getE() == getE());
183
184 ret = (!e) == e1;
185 ret = (!e) == getE();
186 ret = (!getE()) == e1;
187 ret = (!getE()) == getE();
188
189 return ret;
190 }
191
PR16673(int x)192 bool PR16673(int x) {
193 bool ret;
194 // Make sure we don't emit a fixit for the left paren, but not the right paren.
195 #define X(x) x
196 ret = X(!x == 1 && 1);
197 // expected-warning@-1 {{logical not is only applied to the left hand side of this comparison}}
198 // expected-note@-2 {{add parentheses after the '!' to evaluate the comparison first}}
199 // expected-note@-3 {{add parentheses around left hand side expression to silence this warning}}
200 // CHECK: warn-logical-not-compare.cpp:[[line:[0-9]*]]:11: warning
201 // CHECK: to evaluate the comparison first
202 // CHECK-NOT: fix-it
203 // CHECK: to silence this warning
204 // CHECK-NOT: fix-it
205 return ret;
206 }
207