Skip to content

Commit 7550b66

Browse files
pnkfelixpietroalbini
authored andcommitted
borrowck=migrate mode needs to check parent(s) when its given a closure.
1 parent 2824a67 commit 7550b66

File tree

1 file changed

+27
-1
lines changed
  • src/librustc_mir/borrow_check

1 file changed

+27
-1
lines changed

src/librustc_mir/borrow_check/mod.rs

+27-1
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,33 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>(
346346
mbcx.errors_buffer.sort_by_key(|diag| diag.span.primary_span());
347347

348348
if tcx.migrate_borrowck() {
349-
match tcx.borrowck(def_id).signalled_any_error {
349+
// When borrowck=migrate, check if AST-borrowck would
350+
// error on the given code.
351+
352+
// rust-lang/rust#55492: loop over parents to ensure that
353+
// errors that AST-borrowck only detects in some parent of
354+
// a closure still allows NLL to signal an error.
355+
let mut curr_def_id = def_id;
356+
let signalled_any_error = loop {
357+
match tcx.borrowck(curr_def_id).signalled_any_error {
358+
SignalledError::NoErrorsSeen => {
359+
// keep traversing (and borrow-checking) parents
360+
}
361+
SignalledError::SawSomeError => {
362+
// stop search here
363+
break SignalledError::SawSomeError;
364+
}
365+
}
366+
367+
if tcx.is_closure(curr_def_id) {
368+
curr_def_id = tcx.parent_def_id(curr_def_id)
369+
.expect("a closure must have a parent_def_id");
370+
} else {
371+
break SignalledError::NoErrorsSeen;
372+
}
373+
};
374+
375+
match signalled_any_error {
350376
SignalledError::NoErrorsSeen => {
351377
// if AST-borrowck signalled no errors, then
352378
// downgrade all the buffered MIR-borrowck errors

0 commit comments

Comments
 (0)