Skip to content

Commit 2bfab8e

Browse files
committed
add LetVisitor for more accurate span
1 parent 719e41e commit 2bfab8e

36 files changed

+163
-170
lines changed

compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs

+35-27
Original file line numberDiff line numberDiff line change
@@ -451,62 +451,70 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
451451

452452
err.span_label(decl_span, "binding declared here but left uninitialized");
453453
if show_assign_sugg {
454-
self.suggest_assign_rvalue(&mut err, moved_place, &name, decl_span);
454+
struct LetVisitor {
455+
decl_span: Span,
456+
ty_span: Option<Span>,
457+
}
458+
459+
impl<'v> Visitor<'v> for LetVisitor {
460+
fn visit_stmt(&mut self, ex: &'v hir::Stmt<'v>) {
461+
if self.ty_span.is_some() {
462+
return;
463+
}
464+
if let hir::StmtKind::Local(hir::Local {
465+
span, init: None, ty: Some(ty), ..
466+
}) = &ex.kind && span.contains(self.decl_span) {
467+
self.ty_span = Some(ty.span);
468+
}
469+
hir::intravisit::walk_stmt(self, ex);
470+
}
471+
}
472+
473+
let mut visitor = LetVisitor { decl_span, ty_span: None };
474+
visitor.visit_body(&body);
475+
if let Some(ty_span) = visitor.ty_span {
476+
self.suggest_assign_value(&mut err, moved_place, ty_span);
477+
}
455478
}
456479
err
457480
}
458481

459-
fn suggest_assign_rvalue(
482+
fn suggest_assign_value(
460483
&self,
461484
err: &mut Diagnostic,
462485
moved_place: PlaceRef<'tcx>,
463-
name: &str,
464-
decl_span: Span,
486+
ty_span: Span,
465487
) {
466488
let ty = moved_place.ty(self.body, self.infcx.tcx).ty;
467489
debug!("ty: {:?}, kind: {:?}", ty, ty.kind());
468490

469-
let initilize_msg = match ty.kind() {
470-
ty::Array(_, n) => format!("[val; {}]", n),
491+
let assign_value = match ty.kind() {
471492
ty::Int(_) | ty::Uint(_) => format!("0"),
472493
ty::Float(_) => format!("0.0"),
473494
ty::Bool => format!("false"),
474495
ty::Never | ty::Error(_) => "".to_string(),
475496
ty::Adt(def, _substs) => {
476-
if format!("{:?}", def).starts_with("std::vec::Vec") {
497+
if Some(def.did()) == self.infcx.tcx.get_diagnostic_item(sym::Vec) {
477498
format!("vec![]")
478499
} else if let Some(default_trait) = self.infcx.tcx.get_diagnostic_item(sym::Default) &&
479500
self.infcx.tcx.infer_ctxt().enter(|infcx| {
480501
infcx.type_implements_trait(default_trait, ty, ty::List::empty(), self.param_env).may_apply()
481502
}) {
482503
format!("Default::default()")
483504
} else {
484-
format!("something")
505+
format!("todo!()")
485506
}
486-
},
487-
_ => format!("something"),
507+
}
508+
_ => format!("todo!()"),
488509
};
489510

490-
if initilize_msg.is_empty() {
511+
if assign_value.is_empty() {
491512
return;
492513
}
493-
494-
let sugg_span = self
495-
.infcx
496-
.tcx
497-
.sess
498-
.source_map()
499-
.span_extend_while(decl_span, |c| c != '\n')
500-
.unwrap_or(decl_span);
501-
let mut prefix = self.infcx.tcx.sess.source_map().span_to_snippet(sugg_span).unwrap();
502-
// remove last char if eq ';'
503-
if prefix.ends_with(';') {
504-
prefix.pop();
505-
}
506514
err.span_suggestion_verbose(
507-
sugg_span,
508-
format!("use `=` to assign some value to {}", name),
509-
format!("{} = {};", prefix, initilize_msg),
515+
ty_span.shrink_to_hi(),
516+
format!("consider assigning a default value"),
517+
format!(" = {}", assign_value),
510518
Applicability::MaybeIncorrect,
511519
);
512520
}

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ LL | let x: u64;
66
LL | asm!("{}", in(reg) x);
77
| ^ `x` used here but it isn't initialized
88
|
9-
help: use `=` to assign some value to `x`
9+
help: consider assigning a default value
1010
|
1111
LL | let x: u64 = 0;
12-
| ~~~~~~~~~~~
12+
| +++
1313

1414
error[E0381]: used binding `y` isn't initialized
1515
--> $DIR/type-check-5.rs:18:9
@@ -19,10 +19,10 @@ LL | let mut y: u64;
1919
LL | asm!("{}", inout(reg) y);
2020
| ^^^^^^^^^^^^^^^^^^^^^^^^ `y` used here but it isn't initialized
2121
|
22-
help: use `=` to assign some value to `y`
22+
help: consider assigning a default value
2323
|
2424
LL | let mut y: u64 = 0;
25-
| ~~~~~~~~~~~~~~~
25+
| +++
2626

2727
error[E0596]: cannot borrow `v` as mutable, as it is not declared as mutable
2828
--> $DIR/type-check-5.rs:26:29

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ LL | force(|| {
88
LL | println!("{}", x);
99
| - borrow occurs due to use in closure
1010
|
11-
help: use `=` to assign some value to `x`
11+
help: consider assigning a default value
1212
|
1313
LL | let x: isize = 0;
14-
| ~~~~~~~~~~~~~
14+
| +++
1515

1616
error: aborting due to previous error
1717

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ 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: use `=` to assign some value to `x`
11+
help: consider assigning a default value
1212
|
1313
LL | let x: isize = 0;
14-
| ~~~~~~~~~~~~~
14+
| +++
1515

1616
error: aborting due to previous error
1717

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ 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: use `=` to assign some value to `x`
11+
help: consider assigning a default value
1212
|
1313
LL | let x: isize = 0;
14-
| ~~~~~~~~~~~~~
14+
| +++
1515

1616
error: aborting due to previous error
1717

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ LL | let i: isize;
66
LL | i
77
| ^ `i` used here but it isn't initialized
88
|
9-
help: use `=` to assign some value to `i`
9+
help: consider assigning a default value
1010
|
1111
LL | let i: isize = 0;
12-
| ~~~~~~~~~~~~~
12+
| +++
1313

1414
error: aborting due to previous error
1515

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ LL | let i: isize;
66
LL | i
77
| ^ `i` used here but it isn't initialized
88
|
9-
help: use `=` to assign some value to `i`
9+
help: consider assigning a default value
1010
|
1111
LL | let i: isize = 0;
12-
| ~~~~~~~~~~~~~
12+
| +++
1313

1414
error: aborting due to previous error
1515

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ 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: use `=` to assign some value to `origin`
9+
help: consider assigning a default value
1010
|
11-
LL | let mut origin: Point = something;
12-
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11+
LL | let mut origin: Point = todo!();
12+
| +++++++++
1313

1414
error: aborting due to previous error
1515

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ LL | let v: isize;
66
LL | v += 1;
77
| ^^^^^^ `v` used here but it isn't initialized
88
|
9-
help: use `=` to assign some value to `v`
9+
help: consider assigning a default value
1010
|
1111
LL | let v: isize = 0;
12-
| ~~~~~~~~~~~~~
12+
| +++
1313

1414
error: aborting due to previous error
1515

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ LL | let mut v: isize;
66
LL | v = v + 1;
77
| ^ `v` used here but it isn't initialized
88
|
9-
help: use `=` to assign some value to `v`
9+
help: consider assigning a default value
1010
|
1111
LL | let mut v: isize = 0;
12-
| ~~~~~~~~~~~~~~~~~
12+
| +++
1313

1414
error: aborting due to previous error
1515

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ LL | let x: isize;
66
LL | return x;
77
| ^ `x` used here but it isn't initialized
88
|
9-
help: use `=` to assign some value to `x`
9+
help: consider assigning a default value
1010
|
1111
LL | let x: isize = 0;
12-
| ~~~~~~~~~~~~~
12+
| +++
1313

1414
error: aborting due to previous error
1515

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ LL | let x: i32;
66
LL | let _ = x + 1;
77
| ^ `x` used here but it isn't initialized
88
|
9-
help: use `=` to assign some value to `x`
9+
help: consider assigning a default value
1010
|
1111
LL | let x: i32 = 0;
12-
| ~~~~~~~~~~~
12+
| +++
1313

1414
error: aborting due to previous error
1515

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

-5
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,6 @@ 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: use `=` to assign some value to `bar`
11-
|
12-
LL | let bar = 0;
13-
| ~~~~~~~~
149

1510
error: aborting due to previous error
1611

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ LL | let mut a: Point;
66
LL | let _ = a.x + 1;
77
| ^^^ `a.x` used here but it isn't initialized
88
|
9-
help: use `=` to assign some value to `a`
9+
help: consider assigning a default value
1010
|
1111
LL | let mut a: Point = Default::default();
12-
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
12+
| ++++++++++++++++++++
1313

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

0 commit comments

Comments
 (0)