diff --git a/src/librustc/infer/error_reporting/mod.rs b/src/librustc/infer/error_reporting/mod.rs index 90248e89fa73a..212821cac2e4a 100644 --- a/src/librustc/infer/error_reporting/mod.rs +++ b/src/librustc/infer/error_reporting/mod.rs @@ -303,7 +303,14 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> { ) { debug!("report_region_errors(): {} errors to start", errors.len()); - if will_later_be_reported_by_nll && self.tcx.use_mir_borrowck() { + if will_later_be_reported_by_nll && + // FIXME: `use_mir_borrowck` seems wrong here... + self.tcx.use_mir_borrowck() && + // ... this is a band-aid; may be better to explicitly + // match on every borrowck_mode variant to guide decision + // here. + !self.tcx.migrate_borrowck() { + // With `#![feature(nll)]`, we want to present a nice user // experience, so don't even mention the errors from the // AST checker. diff --git a/src/test/ui/borrowck/issue-45983.stderr b/src/test/ui/borrowck/issue-45983.ast.stderr similarity index 92% rename from src/test/ui/borrowck/issue-45983.stderr rename to src/test/ui/borrowck/issue-45983.ast.stderr index 7625b9e76186a..db7cedffd8f72 100644 --- a/src/test/ui/borrowck/issue-45983.stderr +++ b/src/test/ui/borrowck/issue-45983.ast.stderr @@ -1,5 +1,5 @@ error: borrowed data cannot be stored outside of its closure - --> $DIR/issue-45983.rs:17:27 + --> $DIR/issue-45983.rs:36:27 | LL | let x = None; | - borrowed data cannot be stored into here... diff --git a/src/test/ui/borrowck/issue-45983.migrate.stderr b/src/test/ui/borrowck/issue-45983.migrate.stderr new file mode 100644 index 0000000000000..db7cedffd8f72 --- /dev/null +++ b/src/test/ui/borrowck/issue-45983.migrate.stderr @@ -0,0 +1,12 @@ +error: borrowed data cannot be stored outside of its closure + --> $DIR/issue-45983.rs:36:27 + | +LL | let x = None; + | - borrowed data cannot be stored into here... +LL | give_any(|y| x = Some(y)); + | --- ^ cannot be stored outside of its closure + | | + | ...because it cannot outlive this closure + +error: aborting due to previous error + diff --git a/src/test/ui/borrowck/issue-45983.nll.stderr b/src/test/ui/borrowck/issue-45983.nll.stderr index 64086cb07917d..9d62c7dba75ff 100644 --- a/src/test/ui/borrowck/issue-45983.nll.stderr +++ b/src/test/ui/borrowck/issue-45983.nll.stderr @@ -1,11 +1,11 @@ warning: not reporting region error due to nll - --> $DIR/issue-45983.rs:17:27 + --> $DIR/issue-45983.rs:36:27 | LL | give_any(|y| x = Some(y)); | ^ error: borrowed data escapes outside of closure - --> $DIR/issue-45983.rs:17:18 + --> $DIR/issue-45983.rs:36:18 | LL | let x = None; | - `x` is declared here, outside of the closure body @@ -15,7 +15,7 @@ LL | give_any(|y| x = Some(y)); | `y` is a reference that is only valid in the closure body error[E0594]: cannot assign to `x`, as it is not declared as mutable - --> $DIR/issue-45983.rs:17:18 + --> $DIR/issue-45983.rs:36:18 | LL | let x = None; | - help: consider changing this to be mutable: `mut x` diff --git a/src/test/ui/borrowck/issue-45983.rs b/src/test/ui/borrowck/issue-45983.rs index a6e5067195f47..bcbe0d1ffc000 100644 --- a/src/test/ui/borrowck/issue-45983.rs +++ b/src/test/ui/borrowck/issue-45983.rs @@ -8,6 +8,25 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// As documented in Issue #45983, this test is evaluating the quality +// of our diagnostics on erroneous code using higher-ranked closures. +// +// However, as documented on Issue #53026, this test also became a +// prime example of our need to test the NLL migration mode +// *separately* from the existing test suites that focus solely on +// AST-borrwock and NLL. + +// revisions: ast migrate nll + +// Since we are testing nll (and migration) explicitly as a separate +// revisions, dont worry about the --compare-mode=nll on this test. + +// ignore-compare-mode-nll + +//[ast]compile-flags: -Z borrowck=ast +//[migrate]compile-flags: -Z borrowck=migrate -Z two-phase-borrows +//[nll]compile-flags: -Z borrowck=mir -Z two-phase-borrows + fn give_any FnOnce(&'r ())>(f: F) { f(&()); } @@ -15,5 +34,9 @@ fn give_any FnOnce(&'r ())>(f: F) { fn main() { let x = None; give_any(|y| x = Some(y)); - //~^ ERROR borrowed data cannot be stored outside of its closure + //[ast]~^ ERROR borrowed data cannot be stored outside of its closure + //[migrate]~^^ ERROR borrowed data cannot be stored outside of its closure + //[nll]~^^^ WARN not reporting region error due to nll + //[nll]~| ERROR borrowed data escapes outside of closure + //[nll]~| ERROR cannot assign to `x`, as it is not declared as mutable }