From 275432c1151d1c77afbaebaefa2379a76d1af051 Mon Sep 17 00:00:00 2001 From: Matthew Jasper Date: Sun, 14 Oct 2018 14:53:10 +0100 Subject: [PATCH] Give an error number for "borrowed data escapes outside of closure" --- .../nll/region_infer/error_reporting/mod.rs | 5 ++--- src/librustc_mir/diagnostics.rs | 1 + src/librustc_mir/util/borrowck_errors.rs | 18 ++++++++++++++++++ src/test/ui/borrowck/issue-45983.nll.stderr | 5 +++-- ...ter-to-static-comparing-against-free.stderr | 5 +++-- ...roximated-shorter-to-static-no-bound.stderr | 3 ++- ...imated-shorter-to-static-wrong-bound.stderr | 3 ++- 7 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs index 4139c03e410..f2eb0421715 100644 --- a/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs +++ b/src/librustc_mir/borrow_check/nll/region_infer/error_reporting/mod.rs @@ -13,6 +13,7 @@ use borrow_check::nll::region_infer::error_reporting::region_name::RegionNameSource; use borrow_check::nll::type_check::Locations; use borrow_check::nll::universal_regions::DefiningTy; +use util::borrowck_errors::{BorrowckErrors, Origin}; use rustc::hir::def_id::DefId; use rustc::infer::error_reporting::nice_region_error::NiceRegionError; use rustc::infer::InferCtxt; @@ -395,9 +396,7 @@ fn report_escaping_data_error( category, span, errors_buffer); } - let mut diag = infcx.tcx.sess.struct_span_err( - span, &format!("borrowed data escapes outside of {}", escapes_from), - ); + let mut diag = infcx.tcx.borrowed_data_escapes_closure(span, escapes_from, Origin::Mir); if let Some((Some(outlived_fr_name), outlived_fr_span)) = outlived_fr_name_and_span { diag.span_label( diff --git a/src/librustc_mir/diagnostics.rs b/src/librustc_mir/diagnostics.rs index 56031054b91..773064f15dc 100644 --- a/src/librustc_mir/diagnostics.rs +++ b/src/librustc_mir/diagnostics.rs @@ -2339,6 +2339,7 @@ fn foo() -> i32 { 22 } // E0471, // constant evaluation error (in pattern) // E0385, // {} in an aliasable location E0493, // destructors cannot be evaluated at compile-time + E0521, // borrowed data escapes outside of closure E0524, // two closures require unique access to `..` at the same time E0526, // shuffle indices are not constant E0594, // cannot assign to {} diff --git a/src/librustc_mir/util/borrowck_errors.rs b/src/librustc_mir/util/borrowck_errors.rs index 5a7268c057b..eff19a2a9aa 100644 --- a/src/librustc_mir/util/borrowck_errors.rs +++ b/src/librustc_mir/util/borrowck_errors.rs @@ -717,6 +717,24 @@ fn cannot_capture_in_long_lived_closure( self.cancel_if_wrong_origin(err, o) } + fn borrowed_data_escapes_closure( + self, + escape_span: Span, + escapes_from: &str, + o: Origin, + ) -> DiagnosticBuilder<'cx> { + let err = struct_span_err!( + self, + escape_span, + E0521, + "borrowed data escapes outside of {}{OGN}", + escapes_from, + OGN = o + ); + + self.cancel_if_wrong_origin(err, o) + } + fn thread_local_value_does_not_live_long_enough( self, span: Span, diff --git a/src/test/ui/borrowck/issue-45983.nll.stderr b/src/test/ui/borrowck/issue-45983.nll.stderr index 18411b528a3..6588215c221 100644 --- a/src/test/ui/borrowck/issue-45983.nll.stderr +++ b/src/test/ui/borrowck/issue-45983.nll.stderr @@ -1,4 +1,4 @@ -error: borrowed data escapes outside of closure +error[E0521]: borrowed data escapes outside of closure --> $DIR/issue-45983.rs:36:18 | LL | let x = None; @@ -18,4 +18,5 @@ LL | give_any(|y| x = Some(y)); error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0594`. +Some errors occurred: E0521, E0594. +For more information about an error, try `rustc --explain E0521`. diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-comparing-against-free.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-comparing-against-free.stderr index c855cee3c60..993b28092de 100644 --- a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-comparing-against-free.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-comparing-against-free.stderr @@ -13,7 +13,7 @@ LL | | }) for<'r> extern "rust-call" fn((std::cell::Cell<&'_#1r u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) u32>)) ] -error: borrowed data escapes outside of closure +error[E0521]: borrowed data escapes outside of closure --> $DIR/propagate-approximated-shorter-to-static-comparing-against-free.rs:32:9 | LL | foo(cell, |cell_a, cell_x| { @@ -80,4 +80,5 @@ LL | } error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0597`. +Some errors occurred: E0521, E0597. +For more information about an error, try `rustc --explain E0521`. diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-no-bound.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-no-bound.stderr index 7ebd36e10b5..a5435cc65ca 100644 --- a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-no-bound.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-no-bound.stderr @@ -34,7 +34,7 @@ LL | | } | = note: defining type: DefId(0/0:6 ~ propagate_approximated_shorter_to_static_no_bound[317d]::supply[0]) with substs [] -error: borrowed data escapes outside of function +error[E0521]: borrowed data escapes outside of function --> $DIR/propagate-approximated-shorter-to-static-no-bound.rs:45:5 | LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) { @@ -61,3 +61,4 @@ LL | demand_y(x, y, x.get()) error: aborting due to 2 previous errors +For more information about this error, try `rustc --explain E0521`. diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-wrong-bound.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-wrong-bound.stderr index d62910576b0..35692414081 100644 --- a/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-wrong-bound.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-wrong-bound.stderr @@ -33,7 +33,7 @@ LL | | } | = note: defining type: DefId(0/0:6 ~ propagate_approximated_shorter_to_static_wrong_bound[317d]::supply[0]) with substs [] -error: borrowed data escapes outside of function +error[E0521]: borrowed data escapes outside of function --> $DIR/propagate-approximated-shorter-to-static-wrong-bound.rs:48:5 | LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) { @@ -59,3 +59,4 @@ LL | demand_y(x, y, x.get()) error: aborting due to 2 previous errors +For more information about this error, try `rustc --explain E0521`. -- 2.44.0