about summary refs log tree commit diff
diff options
context:
space:
mode:
authorclubby789 <jamie@hill-daniel.co.uk>2024-02-04 17:11:29 +0000
committerclubby789 <jamie@hill-daniel.co.uk>2024-02-06 23:12:23 +0000
commit75da58298774fdb16ffe0bfbede51ec44ce602b6 (patch)
tree0692c1ad3149985f1993a54eb11e8860964d8530
parentb11fbfbf351b94c7eecf9e6749a4544a6d4717fa (diff)
downloadrust-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.rs7
-rw-r--r--tests/ui/borrowck/borrowck-uninit.rs13
-rw-r--r--tests/ui/borrowck/borrowck-uninit.stderr37
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`.