Skip to content

Commit 1cb1646

Browse files
committed
Fix ICE on None.unwrap_or_default()
1 parent 3f4e599 commit 1cb1646

6 files changed

+157
-116
lines changed

clippy_lints/src/methods/unnecessary_literal_unwrap.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use clippy_utils::{diagnostics::span_lint_and_then, is_res_lang_ctor, last_path_
22
use rustc_errors::Applicability;
33
use rustc_hir as hir;
44
use rustc_lint::LateContext;
5+
use rustc_middle::ty::{self, print::with_forced_trimmed_paths};
56

67
use super::UNNECESSARY_LITERAL_UNWRAP;
78

@@ -62,6 +63,16 @@ pub(super) fn check(
6263
(expr.span.with_hi(args[0].span.lo()), "panic!(".to_string()),
6364
(expr.span.with_lo(args[0].span.hi()), ")".to_string()),
6465
]),
66+
("None", "unwrap_or_default", _) => {
67+
let ty = cx.typeck_results().expr_ty(expr);
68+
let default_ty_string = if let ty::Adt(def, ..) = ty.kind() {
69+
with_forced_trimmed_paths!(format!("{}", cx.tcx.def_path_str(def.did())))
70+
} else {
71+
"Default".to_string()
72+
};
73+
Some(vec![(expr.span, format!("{default_ty_string}::default()"))])
74+
},
75+
_ if call_args.is_empty() => None,
6576
(_, _, Some(_)) => None,
6677
("Ok", "unwrap_err", None) | ("Err", "unwrap", None) => Some(vec![
6778
(

tests/ui/unnecessary_literal_unwrap.fixed

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ fn unwrap_option_some() {
1919
fn unwrap_option_none() {
2020
let _val = panic!();
2121
let _val = panic!("this always happens");
22+
let _val: String = String::default();
2223

2324
panic!();
2425
panic!("this always happens");
26+
String::default();
2527
}
2628

2729
fn unwrap_result_ok() {

tests/ui/unnecessary_literal_unwrap.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ fn unwrap_option_some() {
1919
fn unwrap_option_none() {
2020
let _val = None::<()>.unwrap();
2121
let _val = None::<()>.expect("this always happens");
22+
let _val: String = None.unwrap_or_default();
2223

2324
None::<()>.unwrap();
2425
None::<()>.expect("this always happens");
26+
None::<String>.unwrap_or_default();
2527
}
2628

2729
fn unwrap_result_ok() {

tests/ui/unnecessary_literal_unwrap.stderr

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -64,14 +64,20 @@ help: remove the `None` and `expect()`
6464
LL | let _val = panic!("this always happens");
6565
| ~~~~~~~ ~
6666

67+
error: used `unwrap_or_default()` on `None` value
68+
--> $DIR/unnecessary_literal_unwrap.rs:22:24
69+
|
70+
LL | let _val: String = None.unwrap_or_default();
71+
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: remove the `None` and `unwrap_or_default()`: `String::default()`
72+
6773
error: used `unwrap()` on `None` value
68-
--> $DIR/unnecessary_literal_unwrap.rs:23:5
74+
--> $DIR/unnecessary_literal_unwrap.rs:24:5
6975
|
7076
LL | None::<()>.unwrap();
7177
| ^^^^^^^^^^^^^^^^^^^ help: remove the `None` and `unwrap()`: `panic!()`
7278

7379
error: used `expect()` on `None` value
74-
--> $DIR/unnecessary_literal_unwrap.rs:24:5
80+
--> $DIR/unnecessary_literal_unwrap.rs:25:5
7581
|
7682
LL | None::<()>.expect("this always happens");
7783
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -81,8 +87,14 @@ help: remove the `None` and `expect()`
8187
LL | panic!("this always happens");
8288
| ~~~~~~~ ~
8389

90+
error: used `unwrap_or_default()` on `None` value
91+
--> $DIR/unnecessary_literal_unwrap.rs:26:5
92+
|
93+
LL | None::<String>.unwrap_or_default();
94+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove the `None` and `unwrap_or_default()`: `String::default()`
95+
8496
error: used `unwrap()` on `Ok` value
85-
--> $DIR/unnecessary_literal_unwrap.rs:28:16
97+
--> $DIR/unnecessary_literal_unwrap.rs:30:16
8698
|
8799
LL | let _val = Ok::<_, ()>(1).unwrap();
88100
| ^^^^^^^^^^^^^^^^^^^^^^^
@@ -94,7 +106,7 @@ LL + let _val = 1;
94106
|
95107

96108
error: used `expect()` on `Ok` value
97-
--> $DIR/unnecessary_literal_unwrap.rs:29:16
109+
--> $DIR/unnecessary_literal_unwrap.rs:31:16
98110
|
99111
LL | let _val = Ok::<_, ()>(1).expect("this never happens");
100112
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -106,7 +118,7 @@ LL + let _val = 1;
106118
|
107119

108120
error: used `unwrap_err()` on `Ok` value
109-
--> $DIR/unnecessary_literal_unwrap.rs:30:16
121+
--> $DIR/unnecessary_literal_unwrap.rs:32:16
110122
|
111123
LL | let _val = Ok::<_, ()>(1).unwrap_err();
112124
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -117,7 +129,7 @@ LL | let _val = panic!("{:?}", 1);
117129
| ~~~~~~~~~~~~~~ ~
118130

119131
error: used `expect_err()` on `Ok` value
120-
--> $DIR/unnecessary_literal_unwrap.rs:31:16
132+
--> $DIR/unnecessary_literal_unwrap.rs:33:16
121133
|
122134
LL | let _val = Ok::<_, ()>(1).expect_err("this always happens");
123135
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -128,7 +140,7 @@ LL | let _val = panic!("{1}: {:?}", 1, "this always happens");
128140
| ~~~~~~~~~~~~~~~~~~~ ~
129141

130142
error: used `unwrap()` on `Ok` value
131-
--> $DIR/unnecessary_literal_unwrap.rs:33:5
143+
--> $DIR/unnecessary_literal_unwrap.rs:35:5
132144
|
133145
LL | Ok::<_, ()>(1).unwrap();
134146
| ^^^^^^^^^^^^^^^^^^^^^^^
@@ -140,7 +152,7 @@ LL + 1;
140152
|
141153

142154
error: used `expect()` on `Ok` value
143-
--> $DIR/unnecessary_literal_unwrap.rs:34:5
155+
--> $DIR/unnecessary_literal_unwrap.rs:36:5
144156
|
145157
LL | Ok::<_, ()>(1).expect("this never happens");
146158
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -152,7 +164,7 @@ LL + 1;
152164
|
153165

154166
error: used `unwrap_err()` on `Ok` value
155-
--> $DIR/unnecessary_literal_unwrap.rs:35:5
167+
--> $DIR/unnecessary_literal_unwrap.rs:37:5
156168
|
157169
LL | Ok::<_, ()>(1).unwrap_err();
158170
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -163,7 +175,7 @@ LL | panic!("{:?}", 1);
163175
| ~~~~~~~~~~~~~~ ~
164176

165177
error: used `expect_err()` on `Ok` value
166-
--> $DIR/unnecessary_literal_unwrap.rs:36:5
178+
--> $DIR/unnecessary_literal_unwrap.rs:38:5
167179
|
168180
LL | Ok::<_, ()>(1).expect_err("this always happens");
169181
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -174,7 +186,7 @@ LL | panic!("{1}: {:?}", 1, "this always happens");
174186
| ~~~~~~~~~~~~~~~~~~~ ~
175187

176188
error: used `unwrap_err()` on `Err` value
177-
--> $DIR/unnecessary_literal_unwrap.rs:40:16
189+
--> $DIR/unnecessary_literal_unwrap.rs:42:16
178190
|
179191
LL | let _val = Err::<(), _>(1).unwrap_err();
180192
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -186,7 +198,7 @@ LL + let _val = 1;
186198
|
187199

188200
error: used `expect_err()` on `Err` value
189-
--> $DIR/unnecessary_literal_unwrap.rs:41:16
201+
--> $DIR/unnecessary_literal_unwrap.rs:43:16
190202
|
191203
LL | let _val = Err::<(), _>(1).expect_err("this never happens");
192204
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -198,7 +210,7 @@ LL + let _val = 1;
198210
|
199211

200212
error: used `unwrap()` on `Err` value
201-
--> $DIR/unnecessary_literal_unwrap.rs:42:16
213+
--> $DIR/unnecessary_literal_unwrap.rs:44:16
202214
|
203215
LL | let _val = Err::<(), _>(1).unwrap();
204216
| ^^^^^^^^^^^^^^^^^^^^^^^^
@@ -209,7 +221,7 @@ LL | let _val = panic!("{:?}", 1);
209221
| ~~~~~~~~~~~~~~ ~
210222

211223
error: used `expect()` on `Err` value
212-
--> $DIR/unnecessary_literal_unwrap.rs:43:16
224+
--> $DIR/unnecessary_literal_unwrap.rs:45:16
213225
|
214226
LL | let _val = Err::<(), _>(1).expect("this always happens");
215227
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -220,7 +232,7 @@ LL | let _val = panic!("{1}: {:?}", 1, "this always happens");
220232
| ~~~~~~~~~~~~~~~~~~~ ~
221233

222234
error: used `unwrap_err()` on `Err` value
223-
--> $DIR/unnecessary_literal_unwrap.rs:45:5
235+
--> $DIR/unnecessary_literal_unwrap.rs:47:5
224236
|
225237
LL | Err::<(), _>(1).unwrap_err();
226238
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -232,7 +244,7 @@ LL + 1;
232244
|
233245

234246
error: used `expect_err()` on `Err` value
235-
--> $DIR/unnecessary_literal_unwrap.rs:46:5
247+
--> $DIR/unnecessary_literal_unwrap.rs:48:5
236248
|
237249
LL | Err::<(), _>(1).expect_err("this never happens");
238250
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -244,7 +256,7 @@ LL + 1;
244256
|
245257

246258
error: used `unwrap()` on `Err` value
247-
--> $DIR/unnecessary_literal_unwrap.rs:47:5
259+
--> $DIR/unnecessary_literal_unwrap.rs:49:5
248260
|
249261
LL | Err::<(), _>(1).unwrap();
250262
| ^^^^^^^^^^^^^^^^^^^^^^^^
@@ -255,7 +267,7 @@ LL | panic!("{:?}", 1);
255267
| ~~~~~~~~~~~~~~ ~
256268

257269
error: used `expect()` on `Err` value
258-
--> $DIR/unnecessary_literal_unwrap.rs:48:5
270+
--> $DIR/unnecessary_literal_unwrap.rs:50:5
259271
|
260272
LL | Err::<(), _>(1).expect("this always happens");
261273
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -266,7 +278,7 @@ LL | panic!("{1}: {:?}", 1, "this always happens");
266278
| ~~~~~~~~~~~~~~~~~~~ ~
267279

268280
error: used `unwrap_or()` on `Some` value
269-
--> $DIR/unnecessary_literal_unwrap.rs:52:16
281+
--> $DIR/unnecessary_literal_unwrap.rs:54:16
270282
|
271283
LL | let _val = Some(1).unwrap_or(2);
272284
| ^^^^^^^^^^^^^^^^^^^^
@@ -278,7 +290,7 @@ LL + let _val = 1;
278290
|
279291

280292
error: used `unwrap_or_default()` on `Some` value
281-
--> $DIR/unnecessary_literal_unwrap.rs:53:16
293+
--> $DIR/unnecessary_literal_unwrap.rs:55:16
282294
|
283295
LL | let _val = Some(1).unwrap_or_default();
284296
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -290,7 +302,7 @@ LL + let _val = 1;
290302
|
291303

292304
error: used `unwrap_or_else()` on `Some` value
293-
--> $DIR/unnecessary_literal_unwrap.rs:54:16
305+
--> $DIR/unnecessary_literal_unwrap.rs:56:16
294306
|
295307
LL | let _val = Some(1).unwrap_or_else(|| 2);
296308
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -302,7 +314,7 @@ LL + let _val = 1;
302314
|
303315

304316
error: used `unwrap_or()` on `Some` value
305-
--> $DIR/unnecessary_literal_unwrap.rs:56:5
317+
--> $DIR/unnecessary_literal_unwrap.rs:58:5
306318
|
307319
LL | Some(1).unwrap_or(2);
308320
| ^^^^^^^^^^^^^^^^^^^^
@@ -314,7 +326,7 @@ LL + 1;
314326
|
315327

316328
error: used `unwrap_or_default()` on `Some` value
317-
--> $DIR/unnecessary_literal_unwrap.rs:57:5
329+
--> $DIR/unnecessary_literal_unwrap.rs:59:5
318330
|
319331
LL | Some(1).unwrap_or_default();
320332
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -326,7 +338,7 @@ LL + 1;
326338
|
327339

328340
error: used `unwrap_or_else()` on `Some` value
329-
--> $DIR/unnecessary_literal_unwrap.rs:58:5
341+
--> $DIR/unnecessary_literal_unwrap.rs:60:5
330342
|
331343
LL | Some(1).unwrap_or_else(|| 2);
332344
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -338,7 +350,7 @@ LL + 1;
338350
|
339351

340352
error: used `unwrap_or()` on `Ok` value
341-
--> $DIR/unnecessary_literal_unwrap.rs:62:16
353+
--> $DIR/unnecessary_literal_unwrap.rs:64:16
342354
|
343355
LL | let _val = Ok::<_, ()>(1).unwrap_or(2);
344356
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -350,7 +362,7 @@ LL + let _val = 1;
350362
|
351363

352364
error: used `unwrap_or_default()` on `Ok` value
353-
--> $DIR/unnecessary_literal_unwrap.rs:63:16
365+
--> $DIR/unnecessary_literal_unwrap.rs:65:16
354366
|
355367
LL | let _val = Ok::<_, ()>(1).unwrap_or_default();
356368
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -362,7 +374,7 @@ LL + let _val = 1;
362374
|
363375

364376
error: used `unwrap_or_else()` on `Ok` value
365-
--> $DIR/unnecessary_literal_unwrap.rs:64:16
377+
--> $DIR/unnecessary_literal_unwrap.rs:66:16
366378
|
367379
LL | let _val = Ok::<_, ()>(1).unwrap_or_else(|_| 2);
368380
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -374,7 +386,7 @@ LL + let _val = 1;
374386
|
375387

376388
error: used `unwrap_or()` on `Ok` value
377-
--> $DIR/unnecessary_literal_unwrap.rs:66:5
389+
--> $DIR/unnecessary_literal_unwrap.rs:68:5
378390
|
379391
LL | Ok::<_, ()>(1).unwrap_or(2);
380392
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -386,7 +398,7 @@ LL + 1;
386398
|
387399

388400
error: used `unwrap_or_default()` on `Ok` value
389-
--> $DIR/unnecessary_literal_unwrap.rs:67:5
401+
--> $DIR/unnecessary_literal_unwrap.rs:69:5
390402
|
391403
LL | Ok::<_, ()>(1).unwrap_or_default();
392404
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -398,7 +410,7 @@ LL + 1;
398410
|
399411

400412
error: used `unwrap_or_else()` on `Ok` value
401-
--> $DIR/unnecessary_literal_unwrap.rs:68:5
413+
--> $DIR/unnecessary_literal_unwrap.rs:70:5
402414
|
403415
LL | Ok::<_, ()>(1).unwrap_or_else(|_| 2);
404416
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -409,5 +421,5 @@ LL - Ok::<_, ()>(1).unwrap_or_else(|_| 2);
409421
LL + 1;
410422
|
411423

412-
error: aborting due to 36 previous errors
424+
error: aborting due to 38 previous errors
413425

tests/ui/unnecessary_literal_unwrap_unfixable.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ fn unwrap_option_none() {
2121
let val = None::<()>;
2222
let _val2 = val.unwrap();
2323
let _val2 = val.expect("this always happens");
24+
let _val3: u8 = None.unwrap_or_default();
25+
None::<()>.unwrap_or_default();
2426
}
2527

2628
fn unwrap_result_ok() {

0 commit comments

Comments
 (0)