From bb66d70b895899101869a6634f21f5ecdf5e9291 Mon Sep 17 00:00:00 2001 From: Mikhail Modin Date: Fri, 27 Jul 2018 22:46:16 +0100 Subject: [PATCH] fix issues #51351 and #52133 --- .../borrow_check/nll/region_infer/mod.rs | 4 +- .../borrow_check/nll/universal_regions.rs | 77 +++++++++++++++++++ .../propagate-approximated-ref.stderr | 2 +- ...oximated-shorter-to-static-no-bound.stderr | 2 +- ...mated-shorter-to-static-wrong-bound.stderr | 2 +- .../propagate-approximated-val.stderr | 2 +- .../propagate-despite-same-free-region.stderr | 2 +- .../propagate-from-trait-match.stderr | 2 +- src/test/ui/nll/issue-51351.rs | 32 ++++++++ src/test/ui/nll/issue-52133.rs | 50 ++++++++++++ src/test/ui/nll/issue-52133.stderr | 11 +++ .../projection-no-regions-closure.stderr | 8 +- .../projection-one-region-closure.stderr | 8 +- ...tion-one-region-trait-bound-closure.stderr | 10 +-- ...ojection-two-region-trait-bound-closure.rs | 6 +- ...tion-two-region-trait-bound-closure.stderr | 34 ++++---- ...ram-closure-approximate-lower-bound.stderr | 4 +- ...m-closure-outlives-from-return-type.stderr | 2 +- ...-closure-outlives-from-where-clause.stderr | 8 +- 19 files changed, 218 insertions(+), 48 deletions(-) create mode 100644 src/test/ui/nll/issue-51351.rs create mode 100644 src/test/ui/nll/issue-52133.rs create mode 100644 src/test/ui/nll/issue-52133.stderr diff --git a/src/librustc_mir/borrow_check/nll/region_infer/mod.rs b/src/librustc_mir/borrow_check/nll/region_infer/mod.rs index 2ab72f65535..054db33363e 100644 --- a/src/librustc_mir/borrow_check/nll/region_infer/mod.rs +++ b/src/librustc_mir/borrow_check/nll/region_infer/mod.rs @@ -1155,8 +1155,8 @@ impl<'gcx, 'tcx> ClosureRegionRequirementsExt<'gcx, 'tcx> for ClosureRegionRequi // Extract the values of the free regions in `user_closure_ty` // into a vector. These are the regions that we will be // relating to one another. - let closure_mapping = - &UniversalRegions::closure_mapping(tcx, user_closure_ty, self.num_external_vids); + let closure_mapping = &UniversalRegions::closure_mapping( + tcx, user_closure_ty, self.num_external_vids, tcx.closure_base_def_id(closure_def_id)); debug!("apply_requirements: closure_mapping={:?}", closure_mapping); // Create the predicates. diff --git a/src/librustc_mir/borrow_check/nll/universal_regions.rs b/src/librustc_mir/borrow_check/nll/universal_regions.rs index 808e8b6b8fd..9bb7d123133 100644 --- a/src/librustc_mir/borrow_check/nll/universal_regions.rs +++ b/src/librustc_mir/borrow_check/nll/universal_regions.rs @@ -270,6 +270,7 @@ impl<'tcx> UniversalRegions<'tcx> { tcx: TyCtxt<'_, '_, 'tcx>, closure_ty: Ty<'tcx>, expected_num_vars: usize, + closure_base_def_id: DefId, ) -> IndexVec> { let mut region_mapping = IndexVec::with_capacity(expected_num_vars); region_mapping.push(tcx.types.re_static); @@ -277,6 +278,9 @@ impl<'tcx> UniversalRegions<'tcx> { region_mapping.push(fr); }); + for_each_late_bound_region_defined_on( + tcx, closure_base_def_id, |r| { region_mapping.push(r); }); + assert_eq!( region_mapping.len(), expected_num_vars, @@ -479,6 +483,20 @@ impl<'cx, 'gcx, 'tcx> UniversalRegionsBuilder<'cx, 'gcx, 'tcx> { let mut indices = self.compute_indices(fr_static, defining_ty); debug!("build: indices={:?}", indices); + let closure_base_def_id = self.infcx.tcx.closure_base_def_id(self.mir_def_id); + + // If this is a closure or generator, then the late-bound regions from the enclosing + // function are actually external regions to us. For example, here, 'a is not local + // to the closure c (although it is local to the fn foo): + // fn foo<'a>() { + // let c = || { let x: &'a u32 = ...; } + // } + if self.mir_def_id != closure_base_def_id { + self.infcx.replace_late_bound_regions_with_nll_infer_vars( + self.mir_def_id, + &mut indices) + } + let bound_inputs_and_output = self.compute_inputs_and_output(&indices, defining_ty); // "Liberate" the late-bound regions. These correspond to @@ -490,6 +508,14 @@ impl<'cx, 'gcx, 'tcx> UniversalRegionsBuilder<'cx, 'gcx, 'tcx> { &bound_inputs_and_output, &mut indices, ); + // Converse of above, if this is a function then the late-bound regions declared on its + // signature are local to the fn. + if self.mir_def_id == closure_base_def_id { + self.infcx.replace_late_bound_regions_with_nll_infer_vars( + self.mir_def_id, + &mut indices); + } + let fr_fn_body = self.infcx.next_nll_region_var(FR).to_region_vid(); let num_universals = self.infcx.num_region_vars(); @@ -782,6 +808,13 @@ trait InferCtxtExt<'tcx> { ) -> T where T: TypeFoldable<'tcx>; + + + fn replace_late_bound_regions_with_nll_infer_vars( + &self, + mir_def_id: DefId, + indices: &mut UniversalRegionIndices<'tcx> + ); } impl<'cx, 'gcx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'gcx, 'tcx> { @@ -827,6 +860,28 @@ impl<'cx, 'gcx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'gcx, 'tcx> { }); value } + + /// Finds late-bound regions that do not appear in the parameter listing and adds them to the + /// indices vector. Typically, we identify late-bound regions as we process the inputs and + /// outputs of the closure/function. However, sometimes there are late-bound regions which do + /// not appear in the fn parameters but which are nonetheless in scope. The simplest case of + /// this are unused functions, like fn foo<'a>() { } (see eg., #51351). Despite not being used, + /// users can still reference these regions (e.g., let x: &'a u32 = &22;), so we need to create + /// entries for them and store them in the indices map. This code iterates over the complete + /// set of late-bound regions and checks for any that we have not yet seen, adding them to the + /// inputs vector. + fn replace_late_bound_regions_with_nll_infer_vars( + &self, + mir_def_id: DefId, + indices: &mut UniversalRegionIndices<'tcx>, + ) { + let closure_base_def_id = self.tcx.closure_base_def_id(mir_def_id); + for_each_late_bound_region_defined_on(self.tcx, closure_base_def_id, |r| { + if !indices.indices.contains_key(&r) { + let region_vid = self.next_nll_region_var(FR); + indices.insert_late_bound_region(r, region_vid.to_region_vid()); + }}); + } } impl<'tcx> UniversalRegionIndices<'tcx> { @@ -882,3 +937,25 @@ impl<'tcx> FreeRegionRelations<'tcx> for UniversalRegions<'tcx> { self.outlives(longer, shorter) } } + +/// Iterates over the late-bound regions defined on fn_def_id and +/// invokes `f` with the liberated form of each one. +fn for_each_late_bound_region_defined_on<'tcx>( + tcx: TyCtxt<'_, '_, 'tcx>, + fn_def_id: DefId, + mut f: impl FnMut(ty::Region<'tcx>) + ) { + if let Some(late_bounds) = tcx.is_late_bound_map(fn_def_id.index) { + for late_bound in late_bounds.iter() { + let hir_id = HirId{ owner: fn_def_id.index, local_id: *late_bound }; + let region_node_id = tcx.hir.hir_to_node_id(hir_id); + let name = tcx.hir.name(region_node_id).as_interned_str(); + let region_def_id = tcx.hir.local_def_id(region_node_id); + let liberated_region = tcx.mk_region(ty::ReFree(ty::FreeRegion { + scope: fn_def_id, + bound_region: ty::BoundRegion::BrNamed(region_def_id, name), + })); + f(liberated_region); + } + } +} diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr index d713a37fa9f..2704a325314 100644 --- a/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr @@ -20,7 +20,7 @@ LL | | }); i16, for<'r, 's, 't0, 't1, 't2, 't3> extern "rust-call" fn((&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't0)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't1)) &'_#2r u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't2)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't3)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't1)) u32>)) ] - = note: number of external vids: 3 + = note: number of external vids: 5 = note: where '_#1r: '_#2r error[E0623]: lifetime mismatch 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 33e4240736f..d5495b69c7c 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 @@ -20,7 +20,7 @@ LL | | }); i16, for<'r, 's, 't0, 't1, 't2> extern "rust-call" fn((&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't0)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't1)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't2)) u32>)) ] - = note: number of external vids: 2 + = note: number of external vids: 4 = note: where '_#1r: '_#0r error: borrowed data escapes outside of function 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 5f98a0fd36d..50e2dd23da8 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 @@ -20,7 +20,7 @@ LL | | }); i16, for<'r, 's, 't0, 't1, 't2, 't3> extern "rust-call" fn((&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't0)) std::cell::Cell<&'_#2r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't1)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't2)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't3)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't1)) u32>)) ] - = note: number of external vids: 3 + = note: number of external vids: 5 = note: where '_#1r: '_#0r error: borrowed data escapes outside of function diff --git a/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr b/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr index f6ad6e46c62..3cd9e9dd5b0 100644 --- a/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr @@ -20,7 +20,7 @@ LL | | }); i16, for<'r, 's> extern "rust-call" fn((std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) &'_#2r u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>)) ] - = note: number of external vids: 3 + = note: number of external vids: 5 = note: where '_#1r: '_#2r error[E0623]: lifetime mismatch diff --git a/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.stderr b/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.stderr index ef27218e089..0888b1380e6 100644 --- a/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.stderr @@ -18,7 +18,7 @@ LL | | }, i16, for<'r, 's> extern "rust-call" fn((std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) &'_#2r u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>)) ] - = note: number of external vids: 3 + = note: number of external vids: 4 = note: where '_#1r: '_#2r note: No external requirements diff --git a/src/test/ui/nll/closure-requirements/propagate-from-trait-match.stderr b/src/test/ui/nll/closure-requirements/propagate-from-trait-match.stderr index a8b4ed52801..42d5b15bd5a 100644 --- a/src/test/ui/nll/closure-requirements/propagate-from-trait-match.stderr +++ b/src/test/ui/nll/closure-requirements/propagate-from-trait-match.stderr @@ -23,7 +23,7 @@ LL | | }); i32, extern "rust-call" fn((T,)) ] - = note: number of external vids: 2 + = note: number of external vids: 3 = note: where T: '_#1r error[E0309]: the parameter type `T` may not live long enough diff --git a/src/test/ui/nll/issue-51351.rs b/src/test/ui/nll/issue-51351.rs new file mode 100644 index 00000000000..62cc3f9692b --- /dev/null +++ b/src/test/ui/nll/issue-51351.rs @@ -0,0 +1,32 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +// +// Regression test for #51351 and #52133: In the case of #51351, +// late-bound regions (like 'a) that were unused within the arguments of +// a function were overlooked and could case an ICE. In the case of #52133, +// LBR defined on the creator function needed to be added to the free regions +// of the closure, as they were not present in the closure's generic +// declarations otherwise. +// +// compile-pass + +#![feature(nll)] + +fn creash<'a>() { + let x: &'a () = &(); +} + +fn produce<'a>() { + move || { + let x: &'a () = &(); + }; +} + +fn main() {} diff --git a/src/test/ui/nll/issue-52133.rs b/src/test/ui/nll/issue-52133.rs new file mode 100644 index 00000000000..1c509c5d224 --- /dev/null +++ b/src/test/ui/nll/issue-52133.rs @@ -0,0 +1,50 @@ +// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +// + +#![allow(warnings)] +#![feature(nll)] + +trait Bazinga { } +impl Bazinga for F { } + +fn produce1<'a>(data: &'a u32) -> impl Bazinga + 'a { + let x = move || { + let _data: &'a u32 = data; + }; + x +} + +fn produce2<'a>(data: &'a mut Vec<&'a u32>, value: &'a u32) -> impl Bazinga + 'a { + let x = move || { + let value: &'a u32 = value; + data.push(value); + }; + x +} + + +fn produce3<'a, 'b: 'a>(data: &'a mut Vec<&'a u32>, value: &'b u32) -> impl Bazinga + 'a { + let x = move || { + let value: &'a u32 = value; + data.push(value); + }; + x +} + +fn produce_err<'a, 'b: 'a>(data: &'b mut Vec<&'b u32>, value: &'a u32) -> impl Bazinga + 'b { + let x = move || { //~ ERROR lifetime mismatch + let value: &'a u32 = value; + data.push(value); + }; + x +} + +fn main() { } diff --git a/src/test/ui/nll/issue-52133.stderr b/src/test/ui/nll/issue-52133.stderr new file mode 100644 index 00000000000..c1841004cf6 --- /dev/null +++ b/src/test/ui/nll/issue-52133.stderr @@ -0,0 +1,11 @@ +error[E0623]: lifetime mismatch + --> $DIR/issue-52133.rs:43:9 + | +LL | fn produce_err<'a, 'b: 'a>(data: &'b mut Vec<&'b u32>, value: &'a u32) -> impl Bazinga + 'b { + | -------------------- ------- these two types are declared with different lifetimes... +LL | let x = move || { //~ ERROR lifetime mismatch + | ^ ...but data from `value` flows into `data` here + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0623`. diff --git a/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr b/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr index e0705113577..dd12e8220c4 100644 --- a/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr +++ b/src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr @@ -22,7 +22,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) i32, extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box<(dyn Anything + '_#2r)> ] - = note: number of external vids: 3 + = note: number of external vids: 4 = note: where ::Item: '_#2r error[E0309]: the associated type `::Item` may not live long enough @@ -62,7 +62,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) i32, extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box<(dyn Anything + '_#2r)> ] - = note: number of external vids: 3 + = note: number of external vids: 4 = note: where ::Item: '_#2r note: No external requirements @@ -94,7 +94,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) i32, extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box<(dyn Anything + '_#3r)> ] - = note: number of external vids: 4 + = note: number of external vids: 5 = note: where ::Item: '_#3r error[E0309]: the associated type `::Item` may not live long enough @@ -136,7 +136,7 @@ LL | with_signature(x, |mut y| Box::new(y.next())) i32, extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box<(dyn Anything + '_#3r)> ] - = note: number of external vids: 4 + = note: number of external vids: 5 = note: where ::Item: '_#3r note: No external requirements diff --git a/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr b/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr index b84ee4de5a3..456c52d3a51 100644 --- a/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr +++ b/src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr @@ -28,7 +28,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T)) ] - = note: number of external vids: 3 + = note: number of external vids: 5 = note: where T: '_#2r = note: where '_#1r: '_#2r @@ -76,7 +76,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)) ] - = note: number of external vids: 4 + = note: number of external vids: 5 = note: where T: '_#3r = note: where '_#2r: '_#3r @@ -125,7 +125,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)) ] - = note: number of external vids: 4 + = note: number of external vids: 5 = note: where T: '_#3r = note: where '_#2r: '_#3r @@ -174,7 +174,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)) ] - = note: number of external vids: 4 + = note: number of external vids: 5 = note: where T: '_#3r = note: where '_#2r: '_#3r diff --git a/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr b/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr index 42ecd6f9860..35c0405ff89 100644 --- a/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr +++ b/src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr @@ -28,7 +28,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T)) ] - = note: number of external vids: 3 + = note: number of external vids: 5 = note: where '_#1r: '_#2r error: unsatisfied lifetime constraints @@ -67,7 +67,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)) ] - = note: number of external vids: 4 + = note: number of external vids: 5 = note: where '_#2r: '_#3r error: unsatisfied lifetime constraints @@ -107,7 +107,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)) ] - = note: number of external vids: 4 + = note: number of external vids: 5 = note: where '_#2r: '_#3r error: unsatisfied lifetime constraints @@ -147,7 +147,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)) ] - = note: number of external vids: 4 + = note: number of external vids: 5 = note: where '_#2r: '_#3r note: No external requirements @@ -180,7 +180,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T)) ] - = note: number of external vids: 3 + = note: number of external vids: 4 = note: where '_#1r: '_#2r note: No external requirements diff --git a/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.rs b/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.rs index 2552054fd5f..4e51a2bedc8 100644 --- a/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.rs +++ b/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.rs @@ -47,7 +47,7 @@ where { with_signature(cell, t, |cell, t| require(cell, t)); //~^ WARNING not reporting region error due to nll - //~| ERROR associated type `>::AssocType` may not live long enough + //~| ERROR associated type `>::AssocType` may not live long enough } #[rustc_regions] @@ -58,7 +58,7 @@ where { with_signature(cell, t, |cell, t| require(cell, t)); //~^ WARNING not reporting region error due to nll - //~| ERROR associated type `>::AssocType` may not live long enough + //~| ERROR associated type `>::AssocType` may not live long enough } #[rustc_regions] @@ -79,7 +79,7 @@ where with_signature(cell, t, |cell, t| require(cell, t)); //~^ WARNING not reporting region error due to nll - //~| ERROR associated type `>::AssocType` may not live long enough + //~| ERROR associated type `>::AssocType` may not live long enough } #[rustc_regions] diff --git a/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr b/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr index b0f823ad3d5..a713971d17c 100644 --- a/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr +++ b/src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr @@ -35,16 +35,16 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)) ] - = note: number of external vids: 4 + = note: number of external vids: 6 = note: where >::AssocType: '_#3r -error[E0309]: the associated type `>::AssocType` may not live long enough +error[E0309]: the associated type `>::AssocType` may not live long enough --> $DIR/projection-two-region-trait-bound-closure.rs:48:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `>::AssocType: ReFree(DefId(0/0:8 ~ projection_two_region_trait_bound_closure[317d]::no_relationships_late[0]), BrNamed(crate0:DefIndex(1:18), 'a))`... + = help: consider adding an explicit lifetime bound `>::AssocType: ReFree(DefId(0/0:8 ~ projection_two_region_trait_bound_closure[317d]::no_relationships_late[0]), BrNamed(crate0:DefIndex(1:18), 'a))`... note: No external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:44:1 @@ -54,7 +54,7 @@ LL | | where LL | | T: Anything<'b, 'c>, LL | | { ... | -LL | | //~| ERROR associated type `>::AssocType` may not live long enough +LL | | //~| ERROR associated type `>::AssocType` may not live long enough LL | | } | |_^ | @@ -78,16 +78,16 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#4r ()>, T)) ] - = note: number of external vids: 5 + = note: number of external vids: 6 = note: where >::AssocType: '_#4r -error[E0309]: the associated type `>::AssocType` may not live long enough +error[E0309]: the associated type `>::AssocType` may not live long enough --> $DIR/projection-two-region-trait-bound-closure.rs:59:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `>::AssocType: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `>::AssocType: ReEarlyBound(0, 'a)`... note: No external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:54:1 @@ -97,7 +97,7 @@ LL | | where LL | | T: Anything<'b, 'c>, LL | | 'a: 'a, ... | -LL | | //~| ERROR associated type `>::AssocType` may not live long enough +LL | | //~| ERROR associated type `>::AssocType` may not live long enough LL | | } | |_^ | @@ -122,16 +122,16 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#4r ()>, T)) ] - = note: number of external vids: 5 + = note: number of external vids: 6 = note: where >::AssocType: '_#4r -error[E0309]: the associated type `>::AssocType` may not live long enough +error[E0309]: the associated type `>::AssocType` may not live long enough --> $DIR/projection-two-region-trait-bound-closure.rs:80:29 | LL | with_signature(cell, t, |cell, t| require(cell, t)); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = help: consider adding an explicit lifetime bound `>::AssocType: ReEarlyBound(0, 'a)`... + = help: consider adding an explicit lifetime bound `>::AssocType: ReEarlyBound(0, 'a)`... note: No external requirements --> $DIR/projection-two-region-trait-bound-closure.rs:65:1 @@ -141,7 +141,7 @@ LL | | where LL | | T: Anything<'b, 'c>, LL | | T::AssocType: 'a, ... | -LL | | //~| ERROR associated type `>::AssocType` may not live long enough +LL | | //~| ERROR associated type `>::AssocType` may not live long enough LL | | } | |_^ | @@ -166,7 +166,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#4r ()>, T)) ] - = note: number of external vids: 5 + = note: number of external vids: 6 = note: where >::AssocType: '_#4r note: No external requirements @@ -202,7 +202,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#4r ()>, T)) ] - = note: number of external vids: 5 + = note: number of external vids: 6 = note: where >::AssocType: '_#4r note: No external requirements @@ -236,7 +236,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T)) ] - = note: number of external vids: 3 + = note: number of external vids: 5 = note: where >::AssocType: '_#2r error: unsatisfied lifetime constraints @@ -275,7 +275,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)) ] - = note: number of external vids: 4 + = note: number of external vids: 5 = note: where >::AssocType: '_#3r note: No external requirements @@ -308,7 +308,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t)); i32, extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T)) ] - = note: number of external vids: 3 + = note: number of external vids: 4 = note: where >::AssocType: '_#2r note: No external requirements diff --git a/src/test/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.stderr b/src/test/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.stderr index 0ada3fb64ae..39382df8d8a 100644 --- a/src/test/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.stderr +++ b/src/test/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.stderr @@ -27,7 +27,7 @@ LL | twice(cell, value, |a, b| invoke(a, b)); i16, for<'r, 's> extern "rust-call" fn((std::option::Option>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) T)) ] - = note: number of external vids: 2 + = note: number of external vids: 3 = note: where T: '_#1r note: No external requirements @@ -57,7 +57,7 @@ LL | twice(cell, value, |a, b| invoke(a, b)); i16, for<'r, 's> extern "rust-call" fn((std::option::Option>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) T)) ] - = note: number of external vids: 2 + = note: number of external vids: 4 = note: where T: '_#1r error[E0309]: the parameter type `T` may not live long enough diff --git a/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr b/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr index 39ad96cc6cd..8babbe3fd97 100644 --- a/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr +++ b/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr @@ -22,7 +22,7 @@ LL | with_signature(x, |y| y) i32, extern "rust-call" fn((std::boxed::Box,)) -> std::boxed::Box<(dyn std::fmt::Debug + '_#2r)> ] - = note: number of external vids: 3 + = note: number of external vids: 4 = note: where T: '_#2r error[E0309]: the parameter type `T` may not live long enough diff --git a/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-where-clause.stderr b/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-where-clause.stderr index a53ce21b7e6..b9426eba0f6 100644 --- a/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-where-clause.stderr +++ b/src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-where-clause.stderr @@ -28,7 +28,7 @@ LL | | }) i32, extern "rust-call" fn((std::cell::Cell<&'_#1r ()>, T)) ] - = note: number of external vids: 2 + = note: number of external vids: 4 = note: where T: '_#1r error[E0309]: the parameter type `T` may not live long enough @@ -81,7 +81,7 @@ LL | | }) i32, extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T)) ] - = note: number of external vids: 3 + = note: number of external vids: 4 = note: where T: '_#2r note: No external requirements @@ -119,7 +119,7 @@ LL | | }) i32, extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T)) ] - = note: number of external vids: 3 + = note: number of external vids: 5 = note: where T: '_#2r error[E0309]: the parameter type `T` may not live long enough @@ -170,7 +170,7 @@ LL | | }) i32, extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T)) ] - = note: number of external vids: 4 + = note: number of external vids: 5 = note: where T: '_#3r note: No external requirements