Skip to content

Commit 21b9222

Browse files
committed
suggest assign value for let without a type decl
1 parent 2bfab8e commit 21b9222

37 files changed

+136
-97
lines changed

compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -453,27 +453,27 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
453453
if show_assign_sugg {
454454
struct LetVisitor {
455455
decl_span: Span,
456-
ty_span: Option<Span>,
456+
sugg_span: Option<Span>,
457457
}
458458

459459
impl<'v> Visitor<'v> for LetVisitor {
460460
fn visit_stmt(&mut self, ex: &'v hir::Stmt<'v>) {
461-
if self.ty_span.is_some() {
461+
if self.sugg_span.is_some() {
462462
return;
463463
}
464464
if let hir::StmtKind::Local(hir::Local {
465-
span, init: None, ty: Some(ty), ..
465+
span, ty, init: None, ..
466466
}) = &ex.kind && span.contains(self.decl_span) {
467-
self.ty_span = Some(ty.span);
467+
self.sugg_span = ty.map_or(Some(self.decl_span), |ty| Some(ty.span));
468468
}
469469
hir::intravisit::walk_stmt(self, ex);
470470
}
471471
}
472472

473-
let mut visitor = LetVisitor { decl_span, ty_span: None };
473+
let mut visitor = LetVisitor { decl_span, sugg_span: None };
474474
visitor.visit_body(&body);
475-
if let Some(ty_span) = visitor.ty_span {
476-
self.suggest_assign_value(&mut err, moved_place, ty_span);
475+
if let Some(span) = visitor.sugg_span {
476+
self.suggest_assign_value(&mut err, moved_place, span);
477477
}
478478
}
479479
err
@@ -483,40 +483,41 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
483483
&self,
484484
err: &mut Diagnostic,
485485
moved_place: PlaceRef<'tcx>,
486-
ty_span: Span,
486+
sugg_span: Span,
487487
) {
488488
let ty = moved_place.ty(self.body, self.infcx.tcx).ty;
489489
debug!("ty: {:?}, kind: {:?}", ty, ty.kind());
490490

491+
let tcx = self.infcx.tcx;
492+
let implements_default = |ty, param_env| {
493+
let Some(default_trait) = tcx.get_diagnostic_item(sym::Default) else {
494+
return false;
495+
};
496+
tcx.infer_ctxt().enter(|infcx| {
497+
infcx
498+
.type_implements_trait(default_trait, ty, ty::List::empty(), param_env)
499+
.may_apply()
500+
})
501+
};
502+
491503
let assign_value = match ty.kind() {
492-
ty::Int(_) | ty::Uint(_) => format!("0"),
493-
ty::Float(_) => format!("0.0"),
494-
ty::Bool => format!("false"),
495-
ty::Never | ty::Error(_) => "".to_string(),
496-
ty::Adt(def, _substs) => {
497-
if Some(def.did()) == self.infcx.tcx.get_diagnostic_item(sym::Vec) {
498-
format!("vec![]")
499-
} else if let Some(default_trait) = self.infcx.tcx.get_diagnostic_item(sym::Default) &&
500-
self.infcx.tcx.infer_ctxt().enter(|infcx| {
501-
infcx.type_implements_trait(default_trait, ty, ty::List::empty(), self.param_env).may_apply()
502-
}) {
503-
format!("Default::default()")
504-
} else {
505-
format!("todo!()")
506-
}
507-
}
508-
_ => format!("todo!()"),
504+
ty::Bool => "false",
505+
ty::Float(_) => "0.0",
506+
ty::Int(_) | ty::Uint(_) => "0",
507+
ty::Never | ty::Error(_) => "",
508+
ty::Adt(def, _) if Some(def.did()) == tcx.get_diagnostic_item(sym::Vec) => "vec![]",
509+
ty::Adt(_, _) if implements_default(ty, self.param_env) => "Default::default()",
510+
_ => "todo!()",
509511
};
510512

511-
if assign_value.is_empty() {
512-
return;
513+
if !assign_value.is_empty() {
514+
err.span_suggestion_verbose(
515+
sugg_span.shrink_to_hi(),
516+
format!("consider assigning a value"),
517+
format!(" = {}", assign_value),
518+
Applicability::MaybeIncorrect,
519+
);
513520
}
514-
err.span_suggestion_verbose(
515-
ty_span.shrink_to_hi(),
516-
format!("consider assigning a default value"),
517-
format!(" = {}", assign_value),
518-
Applicability::MaybeIncorrect,
519-
);
520521
}
521522

522523
fn suggest_borrow_fn_like(

src/test/ui/asm/x86_64/type-check-5.stderr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let x: u64;
66
LL | asm!("{}", in(reg) x);
77
| ^ `x` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let x: u64 = 0;
1212
| +++
@@ -19,7 +19,7 @@ LL | let mut y: u64;
1919
LL | asm!("{}", inout(reg) y);
2020
| ^^^^^^^^^^^^^^^^^^^^^^^^ `y` used here but it isn't initialized
2121
|
22-
help: consider assigning a default value
22+
help: consider assigning a value
2323
|
2424
LL | let mut y: u64 = 0;
2525
| +++

src/test/ui/borrowck/borrowck-block-unint.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ LL | force(|| {
88
LL | println!("{}", x);
99
| - borrow occurs due to use in closure
1010
|
11-
help: consider assigning a default value
11+
help: consider assigning a value
1212
|
1313
LL | let x: isize = 0;
1414
| +++

src/test/ui/borrowck/borrowck-break-uninit-2.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ LL | println!("{}", x);
88
| ^ `x` used here but it isn't initialized
99
|
1010
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
11-
help: consider assigning a default value
11+
help: consider assigning a value
1212
|
1313
LL | let x: isize = 0;
1414
| +++

src/test/ui/borrowck/borrowck-break-uninit.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ LL | println!("{}", x);
88
| ^ `x` used here but it isn't initialized
99
|
1010
= note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
11-
help: consider assigning a default value
11+
help: consider assigning a value
1212
|
1313
LL | let x: isize = 0;
1414
| +++

src/test/ui/borrowck/borrowck-init-in-called-fn-expr.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let i: isize;
66
LL | i
77
| ^ `i` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let i: isize = 0;
1212
| +++

src/test/ui/borrowck/borrowck-init-in-fn-expr.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let i: isize;
66
LL | i
77
| ^ `i` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let i: isize = 0;
1212
| +++

src/test/ui/borrowck/borrowck-init-in-fru.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let mut origin: Point;
66
LL | origin = Point { x: 10, ..origin };
77
| ^^^^^^^^^^^^^^^^^^^^^^^^^ `origin.y` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let mut origin: Point = todo!();
1212
| +++++++++

src/test/ui/borrowck/borrowck-init-op-equal.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let v: isize;
66
LL | v += 1;
77
| ^^^^^^ `v` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let v: isize = 0;
1212
| +++

src/test/ui/borrowck/borrowck-init-plus-equal.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let mut v: isize;
66
LL | v = v + 1;
77
| ^ `v` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let mut v: isize = 0;
1212
| +++

src/test/ui/borrowck/borrowck-return.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let x: isize;
66
LL | return x;
77
| ^ `x` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let x: isize = 0;
1212
| +++

src/test/ui/borrowck/borrowck-storage-dead.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let x: i32;
66
LL | let _ = x + 1;
77
| ^ `x` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let x: i32 = 0;
1212
| +++

src/test/ui/borrowck/borrowck-uninit-after-item.stderr

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ LL | let bar;
66
LL | fn baz(_x: isize) { }
77
LL | baz(bar);
88
| ^^^ `bar` used here but it isn't initialized
9+
|
10+
help: consider assigning a value
11+
|
12+
LL | let bar = 0;
13+
| +++
914

1015
error: aborting due to previous error
1116

src/test/ui/borrowck/borrowck-uninit-field-access.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let mut a: Point;
66
LL | let _ = a.x + 1;
77
| ^^^ `a.x` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let mut a: Point = Default::default();
1212
| ++++++++++++++++++++

src/test/ui/borrowck/borrowck-uninit-in-assignop.stderr

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let x: isize;
66
LL | x += 1;
77
| ^^^^^^ `x` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let x: isize = 0;
1212
| +++
@@ -19,7 +19,7 @@ LL | let x: isize;
1919
LL | x -= 1;
2020
| ^^^^^^ `x` used here but it isn't initialized
2121
|
22-
help: consider assigning a default value
22+
help: consider assigning a value
2323
|
2424
LL | let x: isize = 0;
2525
| +++
@@ -32,7 +32,7 @@ LL | let x: isize;
3232
LL | x *= 1;
3333
| ^^^^^^ `x` used here but it isn't initialized
3434
|
35-
help: consider assigning a default value
35+
help: consider assigning a value
3636
|
3737
LL | let x: isize = 0;
3838
| +++
@@ -45,7 +45,7 @@ LL | let x: isize;
4545
LL | x /= 1;
4646
| ^^^^^^ `x` used here but it isn't initialized
4747
|
48-
help: consider assigning a default value
48+
help: consider assigning a value
4949
|
5050
LL | let x: isize = 0;
5151
| +++
@@ -58,7 +58,7 @@ LL | let x: isize;
5858
LL | x %= 1;
5959
| ^^^^^^ `x` used here but it isn't initialized
6060
|
61-
help: consider assigning a default value
61+
help: consider assigning a value
6262
|
6363
LL | let x: isize = 0;
6464
| +++
@@ -71,7 +71,7 @@ LL | let x: isize;
7171
LL | x ^= 1;
7272
| ^^^^^^ `x` used here but it isn't initialized
7373
|
74-
help: consider assigning a default value
74+
help: consider assigning a value
7575
|
7676
LL | let x: isize = 0;
7777
| +++
@@ -84,7 +84,7 @@ LL | let x: isize;
8484
LL | x &= 1;
8585
| ^^^^^^ `x` used here but it isn't initialized
8686
|
87-
help: consider assigning a default value
87+
help: consider assigning a value
8888
|
8989
LL | let x: isize = 0;
9090
| +++
@@ -97,7 +97,7 @@ LL | let x: isize;
9797
LL | x |= 1;
9898
| ^^^^^^ `x` used here but it isn't initialized
9999
|
100-
help: consider assigning a default value
100+
help: consider assigning a value
101101
|
102102
LL | let x: isize = 0;
103103
| +++
@@ -110,7 +110,7 @@ LL | let x: isize;
110110
LL | x <<= 1;
111111
| ^^^^^^^ `x` used here but it isn't initialized
112112
|
113-
help: consider assigning a default value
113+
help: consider assigning a value
114114
|
115115
LL | let x: isize = 0;
116116
| +++
@@ -123,7 +123,7 @@ LL | let x: isize;
123123
LL | x >>= 1;
124124
| ^^^^^^^ `x` used here but it isn't initialized
125125
|
126-
help: consider assigning a default value
126+
help: consider assigning a value
127127
|
128128
LL | let x: isize = 0;
129129
| +++

src/test/ui/borrowck/borrowck-uninit-ref-chain.stderr

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let x: &&Box<i32>;
66
LL | let _y = &**x;
77
| ^^^^ `**x` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let x: &&Box<i32> = todo!();
1212
| +++++++++
@@ -19,7 +19,7 @@ LL | let x: &&S<i32, i32>;
1919
LL | let _y = &**x;
2020
| ^^^^ `**x` used here but it isn't initialized
2121
|
22-
help: consider assigning a default value
22+
help: consider assigning a value
2323
|
2424
LL | let x: &&S<i32, i32> = todo!();
2525
| +++++++++
@@ -32,7 +32,7 @@ LL | let x: &&i32;
3232
LL | let _y = &**x;
3333
| ^^^^ `**x` used here but it isn't initialized
3434
|
35-
help: consider assigning a default value
35+
help: consider assigning a value
3636
|
3737
LL | let x: &&i32 = todo!();
3838
| +++++++++

src/test/ui/borrowck/borrowck-uninit.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let x: isize;
66
LL | foo(x);
77
| ^ `x` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let x: isize = 0;
1212
| +++

src/test/ui/borrowck/borrowck-use-in-index-lvalue.stderr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let w: &mut [isize];
66
LL | w[5] = 0;
77
| ^^^^ `*w` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let w: &mut [isize] = todo!();
1212
| +++++++++
@@ -19,7 +19,7 @@ LL | let mut w: &mut [isize];
1919
LL | w[5] = 0;
2020
| ^^^^ `*w` used here but it isn't initialized
2121
|
22-
help: consider assigning a default value
22+
help: consider assigning a value
2323
|
2424
LL | let mut w: &mut [isize] = todo!();
2525
| +++++++++

src/test/ui/borrowck/borrowck-use-uninitialized-in-cast-trait.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let x: &i32;
66
LL | let y = x as *const dyn Foo;
77
| ^ `*x` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let x: &i32 = todo!();
1212
| +++++++++

src/test/ui/borrowck/borrowck-use-uninitialized-in-cast.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | let x: &i32;
66
LL | let y = x as *const i32;
77
| ^ `*x` used here but it isn't initialized
88
|
9-
help: consider assigning a default value
9+
help: consider assigning a value
1010
|
1111
LL | let x: &i32 = todo!();
1212
| +++++++++

0 commit comments

Comments
 (0)