From 75da58298774fdb16ffe0bfbede51ec44ce602b6 Mon Sep 17 00:00:00 2001 From: clubby789 Date: Sun, 4 Feb 2024 17:11:29 +0000 Subject: [PATCH] Fix incorrect suggestion for uninitialize binding in destructuring pattern --- .../src/diagnostics/conflict_errors.rs | 7 +++- tests/ui/borrowck/borrowck-uninit.rs | 13 +++++++ tests/ui/borrowck/borrowck-uninit.stderr | 37 ++++++++++++++++++- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs index 2e83072b8d132..fbd1ccdbf4b3c 100644 --- a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs +++ b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs @@ -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 top-level binding, + // but we could suggest `todo!()` for all uninitalized bindings in the pattern pattern + 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)); diff --git a/tests/ui/borrowck/borrowck-uninit.rs b/tests/ui/borrowck/borrowck-uninit.rs index 5d0ebabb00872..2e2e120d4279a 100644 --- a/tests/ui/borrowck/borrowck-uninit.rs +++ b/tests/ui/borrowck/borrowck-uninit.rs @@ -3,4 +3,17 @@ fn foo(x: isize) { println!("{}", x); } fn main() { let x: isize; foo(x); //~ ERROR E0381 + + // test for #120634 + struct A(u8); + struct B { d: u8 } + 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` } diff --git a/tests/ui/borrowck/borrowck-uninit.stderr b/tests/ui/borrowck/borrowck-uninit.stderr index 213b541b8a920..1e004baa14302 100644 --- a/tests/ui/borrowck/borrowck-uninit.stderr +++ b/tests/ui/borrowck/borrowck-uninit.stderr @@ -11,6 +11,41 @@ help: consider assigning a value LL | let x: isize = 0; | +++ -error: aborting due to 1 previous error +error[E0381]: used binding `a` isn't initialized + --> $DIR/borrowck-uninit.rs:14: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.rs:14: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.rs:14: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.rs:14: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 5 previous errors For more information about this error, try `rustc --explain E0381`.