Skip to content

Commit

Permalink
Auto merge of rust-lang#102184 - chenyukang:fix-102087-add-binding-su…
Browse files Browse the repository at this point in the history
…gg, r=nagisa

Suggest Default::default() when binding isn't initialized

Fixes rust-lang#102087
  • Loading branch information
bors committed Sep 26, 2022
2 parents 21265dd + 672e3f4 commit 84946fe
Show file tree
Hide file tree
Showing 38 changed files with 514 additions and 0 deletions.
70 changes: 70 additions & 0 deletions compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
let mut visitor = ConditionVisitor { spans: &spans, name: &name, errors: vec![] };
visitor.visit_body(&body);

let mut show_assign_sugg = false;
let isnt_initialized = if let InitializationRequiringAction::PartialAssignment
| InitializationRequiringAction::Assignment = desired_action
{
Expand Down Expand Up @@ -395,6 +396,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
.count()
== 0
{
show_assign_sugg = true;
"isn't initialized"
} else {
"is possibly-uninitialized"
Expand Down Expand Up @@ -445,10 +447,78 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
}
}
}

err.span_label(decl_span, "binding declared here but left uninitialized");
if show_assign_sugg {
struct LetVisitor {
decl_span: Span,
sugg_span: Option<Span>,
}

impl<'v> Visitor<'v> for LetVisitor {
fn visit_stmt(&mut self, ex: &'v hir::Stmt<'v>) {
if self.sugg_span.is_some() {
return;
}
if let hir::StmtKind::Local(hir::Local {
span, ty, init: None, ..
}) = &ex.kind && span.contains(self.decl_span) {
self.sugg_span = ty.map_or(Some(self.decl_span), |ty| Some(ty.span));
}
hir::intravisit::walk_stmt(self, ex);
}
}

let mut visitor = LetVisitor { decl_span, sugg_span: None };
visitor.visit_body(&body);
if let Some(span) = visitor.sugg_span {
self.suggest_assign_value(&mut err, moved_place, span);
}
}
err
}

fn suggest_assign_value(
&self,
err: &mut Diagnostic,
moved_place: PlaceRef<'tcx>,
sugg_span: Span,
) {
let ty = moved_place.ty(self.body, self.infcx.tcx).ty;
debug!("ty: {:?}, kind: {:?}", ty, ty.kind());

let tcx = self.infcx.tcx;
let implements_default = |ty, param_env| {
let Some(default_trait) = tcx.get_diagnostic_item(sym::Default) else {
return false;
};
tcx.infer_ctxt().enter(|infcx| {
infcx
.type_implements_trait(default_trait, ty, ty::List::empty(), param_env)
.may_apply()
})
};

let assign_value = match ty.kind() {
ty::Bool => "false",
ty::Float(_) => "0.0",
ty::Int(_) | ty::Uint(_) => "0",
ty::Never | ty::Error(_) => "",
ty::Adt(def, _) if Some(def.did()) == tcx.get_diagnostic_item(sym::Vec) => "vec![]",
ty::Adt(_, _) if implements_default(ty, self.param_env) => "Default::default()",
_ => "todo!()",
};

if !assign_value.is_empty() {
err.span_suggestion_verbose(
sugg_span.shrink_to_hi(),
format!("consider assigning a value"),
format!(" = {}", assign_value),
Applicability::MaybeIncorrect,
);
}
}

fn suggest_borrow_fn_like(
&self,
err: &mut Diagnostic,
Expand Down
10 changes: 10 additions & 0 deletions src/test/ui/asm/aarch64/type-check-2-2.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ LL | let x: u64;
| - binding declared here but left uninitialized
LL | asm!("{}", in(reg) x);
| ^ `x` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let x: u64 = 0;
| +++

error[E0381]: used binding `y` isn't initialized
--> $DIR/type-check-2-2.rs:22:9
Expand All @@ -13,6 +18,11 @@ LL | let mut y: u64;
| ----- binding declared here but left uninitialized
LL | asm!("{}", inout(reg) y);
| ^^^^^^^^^^^^^^^^^^^^^^^^ `y` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let mut y: u64 = 0;
| +++

error[E0596]: cannot borrow `v` as mutable, as it is not declared as mutable
--> $DIR/type-check-2-2.rs:30:29
Expand Down
10 changes: 10 additions & 0 deletions src/test/ui/asm/x86_64/type-check-5.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ LL | let x: u64;
| - binding declared here but left uninitialized
LL | asm!("{}", in(reg) x);
| ^ `x` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let x: u64 = 0;
| +++

error[E0381]: used binding `y` isn't initialized
--> $DIR/type-check-5.rs:18:9
Expand All @@ -13,6 +18,11 @@ LL | let mut y: u64;
| ----- binding declared here but left uninitialized
LL | asm!("{}", inout(reg) y);
| ^^^^^^^^^^^^^^^^^^^^^^^^ `y` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let mut y: u64 = 0;
| +++

error[E0596]: cannot borrow `v` as mutable, as it is not declared as mutable
--> $DIR/type-check-5.rs:26:29
Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/borrowck/borrowck-block-unint.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ LL | force(|| {
| ^^ `x` used here but it isn't initialized
LL | println!("{}", x);
| - borrow occurs due to use in closure
|
help: consider assigning a value
|
LL | let x: isize = 0;
| +++

error: aborting due to previous error

Expand Down
4 changes: 4 additions & 0 deletions src/test/ui/borrowck/borrowck-break-uninit-2.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ LL | println!("{}", x);
| ^ `x` used here but it isn't initialized
|
= 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)
help: consider assigning a value
|
LL | let x: isize = 0;
| +++

error: aborting due to previous error

Expand Down
4 changes: 4 additions & 0 deletions src/test/ui/borrowck/borrowck-break-uninit.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ LL | println!("{}", x);
| ^ `x` used here but it isn't initialized
|
= 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)
help: consider assigning a value
|
LL | let x: isize = 0;
| +++

error: aborting due to previous error

Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/borrowck/borrowck-init-in-called-fn-expr.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ LL | let i: isize;
| - binding declared here but left uninitialized
LL | i
| ^ `i` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let i: isize = 0;
| +++

error: aborting due to previous error

Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/borrowck/borrowck-init-in-fn-expr.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ LL | let i: isize;
| - binding declared here but left uninitialized
LL | i
| ^ `i` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let i: isize = 0;
| +++

error: aborting due to previous error

Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/borrowck/borrowck-init-in-fru.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ LL | let mut origin: Point;
| ---------- binding declared here but left uninitialized
LL | origin = Point { x: 10, ..origin };
| ^^^^^^^^^^^^^^^^^^^^^^^^^ `origin.y` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let mut origin: Point = todo!();
| +++++++++

error: aborting due to previous error

Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/borrowck/borrowck-init-op-equal.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ LL | let v: isize;
| - binding declared here but left uninitialized
LL | v += 1;
| ^^^^^^ `v` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let v: isize = 0;
| +++

error: aborting due to previous error

Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/borrowck/borrowck-init-plus-equal.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ LL | let mut v: isize;
| ----- binding declared here but left uninitialized
LL | v = v + 1;
| ^ `v` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let mut v: isize = 0;
| +++

error: aborting due to previous error

Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/borrowck/borrowck-return.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ LL | let x: isize;
| - binding declared here but left uninitialized
LL | return x;
| ^ `x` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let x: isize = 0;
| +++

error: aborting due to previous error

Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/borrowck/borrowck-storage-dead.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ LL | let x: i32;
| - binding declared here but left uninitialized
LL | let _ = x + 1;
| ^ `x` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let x: i32 = 0;
| +++

error: aborting due to previous error

Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/borrowck/borrowck-uninit-after-item.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ LL | let bar;
LL | fn baz(_x: isize) { }
LL | baz(bar);
| ^^^ `bar` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let bar = 0;
| +++

error: aborting due to previous error

Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/borrowck/borrowck-uninit-field-access.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ LL | let mut a: Point;
| ----- binding declared here but left uninitialized
LL | let _ = a.x + 1;
| ^^^ `a.x` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let mut a: Point = Default::default();
| ++++++++++++++++++++

error[E0382]: use of moved value: `line1.origin`
--> $DIR/borrowck-uninit-field-access.rs:25:13
Expand Down
Loading

0 comments on commit 84946fe

Please sign in to comment.