Skip to content

Commit a366196

Browse files
committed
Also lint on ! (not) unary operator in the ambiguous_precedence lint
1 parent c9d8201 commit a366196

File tree

4 files changed

+52
-12
lines changed

4 files changed

+52
-12
lines changed

compiler/rustc_lint/src/precedence.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ impl EarlyLintPass for Precedence {
6868
}
6969

7070
if let ExprKind::Unary(unop, operand) = &expr.kind
71-
&& matches!(unop, UnOp::Neg)
71+
&& matches!(unop, UnOp::Neg | UnOp::Not)
7272
&& let ExprKind::MethodCall(..) = operand.kind
7373
{
7474
let mut arg = operand;

tests/ui/lint/precedence.fixed

+9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ fn main() {
1818
//~^ WARN operator precedence can trip the unwary
1919
let _ = (1 + 2) << (3 + 1);
2020
//~^ WARN operator precedence can trip the unwary
21+
2122
let _ = -(1i32.abs());
2223
//~^ WARN unary operator `-` has lower precedence than method call
2324
let _ = -(1f32.abs());
@@ -39,11 +40,19 @@ fn main() {
3940
let _ = -(1f64.sin().sin());
4041
//~^ WARN unary operator `-` has lower precedence than method call
4142

43+
let _ = !(10_i32.abs());
44+
//~^ WARN unary operator `!` has lower precedence than method call
45+
let _ = !(10_i32.abs().abs());
46+
//~^ WARN unary operator `!` has lower precedence than method call
47+
4248
// These should not trigger an error
4349
let _ = (-1i32).abs();
4450
let _ = (-1f32).abs();
4551
let _ = -(1i32).abs();
4652
let _ = -(1f32).abs();
4753
let _ = -(1i32.abs());
4854
let _ = -(1f32.abs());
55+
let _ = (!10_i32).abs();
56+
macro_rules! number { () => { 5f32 }; }
57+
let _ = !number!().is_nan();
4958
}

tests/ui/lint/precedence.rs

+9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ fn main() {
1818
//~^ WARN operator precedence can trip the unwary
1919
let _ = 1 + 2 << 3 + 1;
2020
//~^ WARN operator precedence can trip the unwary
21+
2122
let _ = -1i32.abs();
2223
//~^ WARN unary operator `-` has lower precedence than method call
2324
let _ = -1f32.abs();
@@ -39,11 +40,19 @@ fn main() {
3940
let _ = -1f64.sin().sin();
4041
//~^ WARN unary operator `-` has lower precedence than method call
4142

43+
let _ = !10_i32.abs();
44+
//~^ WARN unary operator `!` has lower precedence than method call
45+
let _ = !10_i32.abs().abs();
46+
//~^ WARN unary operator `!` has lower precedence than method call
47+
4248
// These should not trigger an error
4349
let _ = (-1i32).abs();
4450
let _ = (-1f32).abs();
4551
let _ = -(1i32).abs();
4652
let _ = -(1f32).abs();
4753
let _ = -(1i32.abs());
4854
let _ = -(1f32.abs());
55+
let _ = (!10_i32).abs();
56+
macro_rules! number { () => { 5f32 }; }
57+
let _ = !number!().is_nan();
4958
}

tests/ui/lint/precedence.stderr

+33-11
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ LL | let _ = (1 + 2) << (3 + 1);
8888
| + + + +
8989

9090
warning: unary operator `-` has lower precedence than method call
91-
--> $DIR/precedence.rs:21:13
91+
--> $DIR/precedence.rs:22:13
9292
|
9393
LL | let _ = -1i32.abs();
9494
| ^^^^^^^^^^^
@@ -99,7 +99,7 @@ LL | let _ = -(1i32.abs());
9999
| + +
100100

101101
warning: unary operator `-` has lower precedence than method call
102-
--> $DIR/precedence.rs:23:13
102+
--> $DIR/precedence.rs:24:13
103103
|
104104
LL | let _ = -1f32.abs();
105105
| ^^^^^^^^^^^
@@ -110,7 +110,7 @@ LL | let _ = -(1f32.abs());
110110
| + +
111111

112112
warning: unary operator `-` has lower precedence than method call
113-
--> $DIR/precedence.rs:25:13
113+
--> $DIR/precedence.rs:26:13
114114
|
115115
LL | let _ = -1f64.asin();
116116
| ^^^^^^^^^^^^
@@ -121,7 +121,7 @@ LL | let _ = -(1f64.asin());
121121
| + +
122122

123123
warning: unary operator `-` has lower precedence than method call
124-
--> $DIR/precedence.rs:27:13
124+
--> $DIR/precedence.rs:28:13
125125
|
126126
LL | let _ = -1f64.asinh();
127127
| ^^^^^^^^^^^^^
@@ -132,7 +132,7 @@ LL | let _ = -(1f64.asinh());
132132
| + +
133133

134134
warning: unary operator `-` has lower precedence than method call
135-
--> $DIR/precedence.rs:29:13
135+
--> $DIR/precedence.rs:30:13
136136
|
137137
LL | let _ = -1f64.tan();
138138
| ^^^^^^^^^^^
@@ -143,7 +143,7 @@ LL | let _ = -(1f64.tan());
143143
| + +
144144

145145
warning: unary operator `-` has lower precedence than method call
146-
--> $DIR/precedence.rs:31:13
146+
--> $DIR/precedence.rs:32:13
147147
|
148148
LL | let _ = -1f64.tanh();
149149
| ^^^^^^^^^^^^
@@ -154,7 +154,7 @@ LL | let _ = -(1f64.tanh());
154154
| + +
155155

156156
warning: unary operator `-` has lower precedence than method call
157-
--> $DIR/precedence.rs:33:13
157+
--> $DIR/precedence.rs:34:13
158158
|
159159
LL | let _ = -1.0_f64.cos().cos();
160160
| ^^^^^^^^^^^^^^^^^^^^
@@ -165,7 +165,7 @@ LL | let _ = -(1.0_f64.cos().cos());
165165
| + +
166166

167167
warning: unary operator `-` has lower precedence than method call
168-
--> $DIR/precedence.rs:35:13
168+
--> $DIR/precedence.rs:36:13
169169
|
170170
LL | let _ = -1.0_f64.cos().sin();
171171
| ^^^^^^^^^^^^^^^^^^^^
@@ -176,7 +176,7 @@ LL | let _ = -(1.0_f64.cos().sin());
176176
| + +
177177

178178
warning: unary operator `-` has lower precedence than method call
179-
--> $DIR/precedence.rs:37:13
179+
--> $DIR/precedence.rs:38:13
180180
|
181181
LL | let _ = -1.0_f64.sin().cos();
182182
| ^^^^^^^^^^^^^^^^^^^^
@@ -187,7 +187,7 @@ LL | let _ = -(1.0_f64.sin().cos());
187187
| + +
188188

189189
warning: unary operator `-` has lower precedence than method call
190-
--> $DIR/precedence.rs:39:13
190+
--> $DIR/precedence.rs:40:13
191191
|
192192
LL | let _ = -1f64.sin().sin();
193193
| ^^^^^^^^^^^^^^^^^
@@ -197,5 +197,27 @@ help: consider adding parentheses to clarify your intent
197197
LL | let _ = -(1f64.sin().sin());
198198
| + +
199199

200-
warning: 18 warnings emitted
200+
warning: unary operator `!` has lower precedence than method call
201+
--> $DIR/precedence.rs:43:13
202+
|
203+
LL | let _ = !10_i32.abs();
204+
| ^^^^^^^^^^^^^
205+
|
206+
help: consider adding parentheses to clarify your intent
207+
|
208+
LL | let _ = !(10_i32.abs());
209+
| + +
210+
211+
warning: unary operator `!` has lower precedence than method call
212+
--> $DIR/precedence.rs:45:13
213+
|
214+
LL | let _ = !10_i32.abs().abs();
215+
| ^^^^^^^^^^^^^^^^^^^
216+
|
217+
help: consider adding parentheses to clarify your intent
218+
|
219+
LL | let _ = !(10_i32.abs().abs());
220+
| + +
221+
222+
warning: 20 warnings emitted
201223

0 commit comments

Comments
 (0)