Skip to content

Commit 80549a8

Browse files
authored
Rollup merge of #120646 - clubby789:uninit-destructuring-sugg, r=michaelwoerister
Fix incorrect suggestion for uninitialized binding in pattern Fixes #120634
2 parents 6db96de + 75da582 commit 80549a8

File tree

3 files changed

+55
-2
lines changed

3 files changed

+55
-2
lines changed

compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,12 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
613613
if self.sugg_span.is_some() {
614614
return;
615615
}
616-
if let hir::StmtKind::Local(hir::Local { span, ty, init: None, .. }) = &ex.kind
616+
617+
// FIXME: We make sure that this is a normal top-level binding,
618+
// but we could suggest `todo!()` for all uninitalized bindings in the pattern pattern
619+
if let hir::StmtKind::Local(hir::Local { span, ty, init: None, pat, .. }) =
620+
&ex.kind
621+
&& let hir::PatKind::Binding(..) = pat.kind
617622
&& span.contains(self.decl_span)
618623
{
619624
self.sugg_span = ty.map_or(Some(self.decl_span), |ty| Some(ty.span));

tests/ui/borrowck/borrowck-uninit.rs

+13
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,17 @@ fn foo(x: isize) { println!("{}", x); }
33
fn main() {
44
let x: isize;
55
foo(x); //~ ERROR E0381
6+
7+
// test for #120634
8+
struct A(u8);
9+
struct B { d: u8 }
10+
let (a, );
11+
let [b, ];
12+
let A(c);
13+
let B { d };
14+
let _: (u8, u8, u8, u8) = (a, b, c, d);
15+
//~^ ERROR used binding `a`
16+
//~| ERROR used binding `b`
17+
//~| ERROR used binding `c`
18+
//~| ERROR used binding `d`
619
}

tests/ui/borrowck/borrowck-uninit.stderr

+36-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,41 @@ help: consider assigning a value
1111
LL | let x: isize = 0;
1212
| +++
1313

14-
error: aborting due to 1 previous error
14+
error[E0381]: used binding `a` isn't initialized
15+
--> $DIR/borrowck-uninit.rs:14:32
16+
|
17+
LL | let (a, );
18+
| - binding declared here but left uninitialized
19+
...
20+
LL | let _: (u8, u8, u8, u8) = (a, b, c, d);
21+
| ^ `a` used here but it isn't initialized
22+
23+
error[E0381]: used binding `b` isn't initialized
24+
--> $DIR/borrowck-uninit.rs:14:35
25+
|
26+
LL | let [b, ];
27+
| - binding declared here but left uninitialized
28+
...
29+
LL | let _: (u8, u8, u8, u8) = (a, b, c, d);
30+
| ^ `b` used here but it isn't initialized
31+
32+
error[E0381]: used binding `c` isn't initialized
33+
--> $DIR/borrowck-uninit.rs:14:38
34+
|
35+
LL | let A(c);
36+
| - binding declared here but left uninitialized
37+
LL | let B { d };
38+
LL | let _: (u8, u8, u8, u8) = (a, b, c, d);
39+
| ^ `c` used here but it isn't initialized
40+
41+
error[E0381]: used binding `d` isn't initialized
42+
--> $DIR/borrowck-uninit.rs:14:41
43+
|
44+
LL | let B { d };
45+
| - binding declared here but left uninitialized
46+
LL | let _: (u8, u8, u8, u8) = (a, b, c, d);
47+
| ^ `d` used here but it isn't initialized
48+
49+
error: aborting due to 5 previous errors
1550

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

0 commit comments

Comments
 (0)