diff options
| author | clubby789 <jamie@hill-daniel.co.uk> | 2024-02-04 17:11:29 +0000 |
|---|---|---|
| committer | clubby789 <jamie@hill-daniel.co.uk> | 2024-02-06 23:12:23 +0000 |
| commit | 75da58298774fdb16ffe0bfbede51ec44ce602b6 (patch) | |
| tree | 0692c1ad3149985f1993a54eb11e8860964d8530 | |
| parent | b11fbfbf351b94c7eecf9e6749a4544a6d4717fa (diff) | |
| download | rust-75da58298774fdb16ffe0bfbede51ec44ce602b6.tar.gz rust-75da58298774fdb16ffe0bfbede51ec44ce602b6.zip | |
Fix incorrect suggestion for uninitialize binding in destructuring pattern
| -rw-r--r-- | compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs | 7 | ||||
| -rw-r--r-- | tests/ui/borrowck/borrowck-uninit.rs | 13 | ||||
| -rw-r--r-- | 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 2e83072b8d1..fbd1ccdbf4b 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 5d0ebabb008..2e2e120d427 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 213b541b8a9..1e004baa143 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`. |
