Skip to content

Commit

Permalink
Fix incorrect suggestion for uninitialize binding in destructuring pa…
Browse files Browse the repository at this point in the history
…ttern
  • Loading branch information
clubby789 committed Feb 4, 2024
1 parent b11fbfb commit ce136f8
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 1 deletion.
7 changes: 6 additions & 1 deletion compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -613,7 +613,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
if self.sugg_span.is_some() {
return;
}
if let hir::StmtKind::Local(hir::Local { span, ty, init: None, .. }) = &ex.kind

// FIXME: We make sure that this is a normal binding and not a destructuring assignment,
// but we could suggest `todo!()` for all uninitalized bindings in the destructuring
if let hir::StmtKind::Local(hir::Local { span, ty, init: None, pat, .. }) =
&ex.kind
&& let hir::PatKind::Binding(..) = pat.kind
&& span.contains(self.decl_span)
{
self.sugg_span = ty.map_or(Some(self.decl_span), |ty| Some(ty.span));
Expand Down
16 changes: 16 additions & 0 deletions tests/ui/borrowck/borrowck-uninit-binding-suggestion.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// regression test for #120634

struct A(u8);
struct B { d: u8 }

fn main() {
let (a, );
let [b, ];
let A(c);
let B { d };
let _: (u8, u8, u8, u8) = (a, b, c, d);
//~^ ERROR used binding `a`
//~| ERROR used binding `b`
//~| ERROR used binding `c`
//~| ERROR used binding `d`
}
38 changes: 38 additions & 0 deletions tests/ui/borrowck/borrowck-uninit-binding-suggestion.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
error[E0381]: used binding `a` isn't initialized
--> $DIR/borrowck-uninit-binding-suggestion.rs:11:32
|
LL | let (a, );
| - binding declared here but left uninitialized
...
LL | let _: (u8, u8, u8, u8) = (a, b, c, d);
| ^ `a` used here but it isn't initialized

error[E0381]: used binding `b` isn't initialized
--> $DIR/borrowck-uninit-binding-suggestion.rs:11:35
|
LL | let [b, ];
| - binding declared here but left uninitialized
...
LL | let _: (u8, u8, u8, u8) = (a, b, c, d);
| ^ `b` used here but it isn't initialized

error[E0381]: used binding `c` isn't initialized
--> $DIR/borrowck-uninit-binding-suggestion.rs:11:38
|
LL | let A(c);
| - binding declared here but left uninitialized
LL | let B { d };
LL | let _: (u8, u8, u8, u8) = (a, b, c, d);
| ^ `c` used here but it isn't initialized

error[E0381]: used binding `d` isn't initialized
--> $DIR/borrowck-uninit-binding-suggestion.rs:11:41
|
LL | let B { d };
| - binding declared here but left uninitialized
LL | let _: (u8, u8, u8, u8) = (a, b, c, d);
| ^ `d` used here but it isn't initialized

error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0381`.

0 comments on commit ce136f8

Please sign in to comment.