Skip to content

Commit 29cc0d8

Browse files
committed
Auto merge of #8372 - tamaroning:unwrap_used, r=llogiq
make unwrap_used also trigger on .get().unwrap() fixes #8124 changelog: make the [unwrap_used] lint trigger for code of the form such as `.get(i).unwrap()` and `.get_mut(i).unwrap()`
2 parents 699ee5e + 447ed5c commit 29cc0d8

File tree

4 files changed

+149
-25
lines changed

4 files changed

+149
-25
lines changed

clippy_lints/src/methods/mod.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2402,10 +2402,17 @@ fn check_methods<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>, msrv: Optio
24022402
("to_os_string" | "to_owned" | "to_path_buf" | "to_vec", []) => {
24032403
implicit_clone::check(cx, name, expr, recv);
24042404
},
2405-
("unwrap", []) => match method_call(recv) {
2406-
Some(("get", [recv, get_arg], _)) => get_unwrap::check(cx, expr, recv, get_arg, false),
2407-
Some(("get_mut", [recv, get_arg], _)) => get_unwrap::check(cx, expr, recv, get_arg, true),
2408-
_ => unwrap_used::check(cx, expr, recv),
2405+
("unwrap", []) => {
2406+
match method_call(recv) {
2407+
Some(("get", [recv, get_arg], _)) => {
2408+
get_unwrap::check(cx, expr, recv, get_arg, false);
2409+
},
2410+
Some(("get_mut", [recv, get_arg], _)) => {
2411+
get_unwrap::check(cx, expr, recv, get_arg, true);
2412+
},
2413+
_ => {},
2414+
}
2415+
unwrap_used::check(cx, expr, recv);
24092416
},
24102417
("unwrap_or", [u_arg]) => match method_call(recv) {
24112418
Some((arith @ ("checked_add" | "checked_sub" | "checked_mul"), [lhs, rhs], _)) => {

tests/ui/get_unwrap.fixed

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// run-rustfix
2+
23
#![allow(unused_mut, clippy::from_iter_instead_of_collect)]
4+
#![warn(clippy::unwrap_used)]
35
#![deny(clippy::get_unwrap)]
46

57
use std::collections::BTreeMap;
@@ -37,6 +39,7 @@ fn main() {
3739
let _ = &some_vecdeque[0];
3840
let _ = &some_hashmap[&1];
3941
let _ = &some_btreemap[&1];
42+
#[allow(clippy::unwrap_used)]
4043
let _ = false_positive.get(0).unwrap();
4144
// Test with deref
4245
let _: u8 = boxed_slice[1];
@@ -49,9 +52,12 @@ fn main() {
4952
some_vec[0] = 1;
5053
some_vecdeque[0] = 1;
5154
// Check false positives
52-
*some_hashmap.get_mut(&1).unwrap() = 'b';
53-
*some_btreemap.get_mut(&1).unwrap() = 'b';
54-
*false_positive.get_mut(0).unwrap() = 1;
55+
#[allow(clippy::unwrap_used)]
56+
{
57+
*some_hashmap.get_mut(&1).unwrap() = 'b';
58+
*some_btreemap.get_mut(&1).unwrap() = 'b';
59+
*false_positive.get_mut(0).unwrap() = 1;
60+
}
5561
}
5662

5763
{

tests/ui/get_unwrap.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// run-rustfix
2+
23
#![allow(unused_mut, clippy::from_iter_instead_of_collect)]
4+
#![warn(clippy::unwrap_used)]
35
#![deny(clippy::get_unwrap)]
46

57
use std::collections::BTreeMap;
@@ -37,6 +39,7 @@ fn main() {
3739
let _ = some_vecdeque.get(0).unwrap();
3840
let _ = some_hashmap.get(&1).unwrap();
3941
let _ = some_btreemap.get(&1).unwrap();
42+
#[allow(clippy::unwrap_used)]
4043
let _ = false_positive.get(0).unwrap();
4144
// Test with deref
4245
let _: u8 = *boxed_slice.get(1).unwrap();
@@ -49,9 +52,12 @@ fn main() {
4952
*some_vec.get_mut(0).unwrap() = 1;
5053
*some_vecdeque.get_mut(0).unwrap() = 1;
5154
// Check false positives
52-
*some_hashmap.get_mut(&1).unwrap() = 'b';
53-
*some_btreemap.get_mut(&1).unwrap() = 'b';
54-
*false_positive.get_mut(0).unwrap() = 1;
55+
#[allow(clippy::unwrap_used)]
56+
{
57+
*some_hashmap.get_mut(&1).unwrap() = 'b';
58+
*some_btreemap.get_mut(&1).unwrap() = 'b';
59+
*false_positive.get_mut(0).unwrap() = 1;
60+
}
5561
}
5662

5763
{

tests/ui/get_unwrap.stderr

Lines changed: 120 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,191 @@
11
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise
2-
--> $DIR/get_unwrap.rs:34:17
2+
--> $DIR/get_unwrap.rs:36:17
33
|
44
LL | let _ = boxed_slice.get(1).unwrap();
55
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&boxed_slice[1]`
66
|
77
note: the lint level is defined here
8-
--> $DIR/get_unwrap.rs:3:9
8+
--> $DIR/get_unwrap.rs:5:9
99
|
1010
LL | #![deny(clippy::get_unwrap)]
1111
| ^^^^^^^^^^^^^^^^^^
1212

13+
error: used `unwrap()` on `an Option` value
14+
--> $DIR/get_unwrap.rs:36:17
15+
|
16+
LL | let _ = boxed_slice.get(1).unwrap();
17+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
18+
|
19+
= note: `-D clippy::unwrap-used` implied by `-D warnings`
20+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
21+
1322
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise
14-
--> $DIR/get_unwrap.rs:35:17
23+
--> $DIR/get_unwrap.rs:37:17
1524
|
1625
LL | let _ = some_slice.get(0).unwrap();
1726
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&some_slice[0]`
1827

28+
error: used `unwrap()` on `an Option` value
29+
--> $DIR/get_unwrap.rs:37:17
30+
|
31+
LL | let _ = some_slice.get(0).unwrap();
32+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
33+
|
34+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
35+
1936
error: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise
20-
--> $DIR/get_unwrap.rs:36:17
37+
--> $DIR/get_unwrap.rs:38:17
2138
|
2239
LL | let _ = some_vec.get(0).unwrap();
2340
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&some_vec[0]`
2441

42+
error: used `unwrap()` on `an Option` value
43+
--> $DIR/get_unwrap.rs:38:17
44+
|
45+
LL | let _ = some_vec.get(0).unwrap();
46+
| ^^^^^^^^^^^^^^^^^^^^^^^^
47+
|
48+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
49+
2550
error: called `.get().unwrap()` on a VecDeque. Using `[]` is more clear and more concise
26-
--> $DIR/get_unwrap.rs:37:17
51+
--> $DIR/get_unwrap.rs:39:17
2752
|
2853
LL | let _ = some_vecdeque.get(0).unwrap();
2954
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&some_vecdeque[0]`
3055

56+
error: used `unwrap()` on `an Option` value
57+
--> $DIR/get_unwrap.rs:39:17
58+
|
59+
LL | let _ = some_vecdeque.get(0).unwrap();
60+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
61+
|
62+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
63+
3164
error: called `.get().unwrap()` on a HashMap. Using `[]` is more clear and more concise
32-
--> $DIR/get_unwrap.rs:38:17
65+
--> $DIR/get_unwrap.rs:40:17
3366
|
3467
LL | let _ = some_hashmap.get(&1).unwrap();
3568
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&some_hashmap[&1]`
3669

70+
error: used `unwrap()` on `an Option` value
71+
--> $DIR/get_unwrap.rs:40:17
72+
|
73+
LL | let _ = some_hashmap.get(&1).unwrap();
74+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
75+
|
76+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
77+
3778
error: called `.get().unwrap()` on a BTreeMap. Using `[]` is more clear and more concise
38-
--> $DIR/get_unwrap.rs:39:17
79+
--> $DIR/get_unwrap.rs:41:17
3980
|
4081
LL | let _ = some_btreemap.get(&1).unwrap();
4182
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `&some_btreemap[&1]`
4283

84+
error: used `unwrap()` on `an Option` value
85+
--> $DIR/get_unwrap.rs:41:17
86+
|
87+
LL | let _ = some_btreemap.get(&1).unwrap();
88+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
89+
|
90+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
91+
4392
error: called `.get().unwrap()` on a slice. Using `[]` is more clear and more concise
44-
--> $DIR/get_unwrap.rs:42:21
93+
--> $DIR/get_unwrap.rs:45:21
4594
|
4695
LL | let _: u8 = *boxed_slice.get(1).unwrap();
4796
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `boxed_slice[1]`
4897

98+
error: used `unwrap()` on `an Option` value
99+
--> $DIR/get_unwrap.rs:45:22
100+
|
101+
LL | let _: u8 = *boxed_slice.get(1).unwrap();
102+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
103+
|
104+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
105+
49106
error: called `.get_mut().unwrap()` on a slice. Using `[]` is more clear and more concise
50-
--> $DIR/get_unwrap.rs:47:9
107+
--> $DIR/get_unwrap.rs:50:9
51108
|
52109
LL | *boxed_slice.get_mut(0).unwrap() = 1;
53110
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `boxed_slice[0]`
54111

112+
error: used `unwrap()` on `an Option` value
113+
--> $DIR/get_unwrap.rs:50:10
114+
|
115+
LL | *boxed_slice.get_mut(0).unwrap() = 1;
116+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
117+
|
118+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
119+
55120
error: called `.get_mut().unwrap()` on a slice. Using `[]` is more clear and more concise
56-
--> $DIR/get_unwrap.rs:48:9
121+
--> $DIR/get_unwrap.rs:51:9
57122
|
58123
LL | *some_slice.get_mut(0).unwrap() = 1;
59124
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `some_slice[0]`
60125

126+
error: used `unwrap()` on `an Option` value
127+
--> $DIR/get_unwrap.rs:51:10
128+
|
129+
LL | *some_slice.get_mut(0).unwrap() = 1;
130+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
131+
|
132+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
133+
61134
error: called `.get_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise
62-
--> $DIR/get_unwrap.rs:49:9
135+
--> $DIR/get_unwrap.rs:52:9
63136
|
64137
LL | *some_vec.get_mut(0).unwrap() = 1;
65138
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `some_vec[0]`
66139

140+
error: used `unwrap()` on `an Option` value
141+
--> $DIR/get_unwrap.rs:52:10
142+
|
143+
LL | *some_vec.get_mut(0).unwrap() = 1;
144+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
145+
|
146+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
147+
67148
error: called `.get_mut().unwrap()` on a VecDeque. Using `[]` is more clear and more concise
68-
--> $DIR/get_unwrap.rs:50:9
149+
--> $DIR/get_unwrap.rs:53:9
69150
|
70151
LL | *some_vecdeque.get_mut(0).unwrap() = 1;
71152
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `some_vecdeque[0]`
72153

154+
error: used `unwrap()` on `an Option` value
155+
--> $DIR/get_unwrap.rs:53:10
156+
|
157+
LL | *some_vecdeque.get_mut(0).unwrap() = 1;
158+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
159+
|
160+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
161+
73162
error: called `.get().unwrap()` on a Vec. Using `[]` is more clear and more concise
74-
--> $DIR/get_unwrap.rs:59:17
163+
--> $DIR/get_unwrap.rs:65:17
75164
|
76165
LL | let _ = some_vec.get(0..1).unwrap().to_vec();
77166
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `some_vec[0..1]`
78167

168+
error: used `unwrap()` on `an Option` value
169+
--> $DIR/get_unwrap.rs:65:17
170+
|
171+
LL | let _ = some_vec.get(0..1).unwrap().to_vec();
172+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
173+
|
174+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
175+
79176
error: called `.get_mut().unwrap()` on a Vec. Using `[]` is more clear and more concise
80-
--> $DIR/get_unwrap.rs:60:17
177+
--> $DIR/get_unwrap.rs:66:17
81178
|
82179
LL | let _ = some_vec.get_mut(0..1).unwrap().to_vec();
83180
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try this: `some_vec[0..1]`
84181

85-
error: aborting due to 13 previous errors
182+
error: used `unwrap()` on `an Option` value
183+
--> $DIR/get_unwrap.rs:66:17
184+
|
185+
LL | let _ = some_vec.get_mut(0..1).unwrap().to_vec();
186+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
187+
|
188+
= help: if you don't want to handle the `None` case gracefully, consider using `expect()` to provide a better panic message
189+
190+
error: aborting due to 26 previous errors
86191

0 commit comments

Comments
 (0)