]> git.lizzy.rs Git - rust.git/commitdiff
fix issues #51351 and #52133
authorMikhail Modin <mmmodin@amazon.com>
Fri, 27 Jul 2018 21:46:16 +0000 (22:46 +0100)
committerMikhail Modin <mikhailm1@gmail.com>
Sun, 29 Jul 2018 10:42:50 +0000 (11:42 +0100)
19 files changed:
src/librustc_mir/borrow_check/nll/region_infer/mod.rs
src/librustc_mir/borrow_check/nll/universal_regions.rs
src/test/ui/nll/closure-requirements/propagate-approximated-ref.stderr
src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-no-bound.stderr
src/test/ui/nll/closure-requirements/propagate-approximated-shorter-to-static-wrong-bound.stderr
src/test/ui/nll/closure-requirements/propagate-approximated-val.stderr
src/test/ui/nll/closure-requirements/propagate-despite-same-free-region.stderr
src/test/ui/nll/closure-requirements/propagate-from-trait-match.stderr
src/test/ui/nll/issue-51351.rs [new file with mode: 0644]
src/test/ui/nll/issue-52133.rs [new file with mode: 0644]
src/test/ui/nll/issue-52133.stderr [new file with mode: 0644]
src/test/ui/nll/ty-outlives/projection-no-regions-closure.stderr
src/test/ui/nll/ty-outlives/projection-one-region-closure.stderr
src/test/ui/nll/ty-outlives/projection-one-region-trait-bound-closure.stderr
src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.rs
src/test/ui/nll/ty-outlives/projection-two-region-trait-bound-closure.stderr
src/test/ui/nll/ty-outlives/ty-param-closure-approximate-lower-bound.stderr
src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-return-type.stderr
src/test/ui/nll/ty-outlives/ty-param-closure-outlives-from-where-clause.stderr

index 2ab72f655352fd67d5d620397c26ad4994966d11..054db33363e48c5f6798b99a8e15c80ba1b7cab0 100644 (file)
@@ -1155,8 +1155,8 @@ fn apply_requirements(
         // 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.
index 808e8b6b8fdfc5a2664b37fcef899f13359aa619..9bb7d12313349d0f3680600c057ca82de3020d80 100644 (file)
@@ -270,6 +270,7 @@ pub fn closure_mapping(
         tcx: TyCtxt<'_, '_, 'tcx>,
         closure_ty: Ty<'tcx>,
         expected_num_vars: usize,
+        closure_base_def_id: DefId,
     ) -> IndexVec<RegionVid, ty::Region<'tcx>> {
         let mut region_mapping = IndexVec::with_capacity(expected_num_vars);
         region_mapping.push(tcx.types.re_static);
@@ -277,6 +278,9 @@ pub fn closure_mapping(
             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 @@ fn build(mut self) -> UniversalRegions<'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 @@ fn build(mut self) -> UniversalRegions<'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 @@ fn replace_bound_regions_with_nll_infer_vars<T>(
     ) -> 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 @@ fn replace_bound_regions_with_nll_infer_vars<T>(
         });
         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 @@ fn sub_free_regions(&self, shorter: ty::Region<'tcx>, longer: ty::Region<'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);
+        }
+    }
+}
index d713a37fa9f41e8e5a256af006adcae0c490442f..2704a325314664e89ac45e2b6356458fb546b3fc 100644 (file)
@@ -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
index 33e4240736f5bfdd7c8ad17cf6bb0218ac0cddaa..d5495b69c7ced1ef761b21d8f74d06e0fa498e16 100644 (file)
@@ -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
index 5f98a0fd36d7989414fb691283e84b221add3b04..50e2dd23da8a88e5527ebeeb86fe3a99ce86c7aa 100644 (file)
@@ -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
index f6ad6e46c6299c82b7b38bf30f862916fb2283ca..3cd9e9dd5b008f19322475a1ed6ddc342dc6ea10 100644 (file)
@@ -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
index ef27218e0899fd38f4304ec66f85a8e8f9410e18..0888b1380e69e79c8f9922e7c58eb74308a146b7 100644 (file)
@@ -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
index a8b4ed528015fbf3c9e26a92ce0c6429d51cfd8d..42d5b15bd5a29d7c460d88a2c312159e0cdefa5d 100644 (file)
@@ -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 (file)
index 0000000..62cc3f9
--- /dev/null
@@ -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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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 (file)
index 0000000..1c509c5
--- /dev/null
@@ -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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+//
+
+#![allow(warnings)]
+#![feature(nll)]
+
+trait Bazinga { }
+impl<F> 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 (file)
index 0000000..c184100
--- /dev/null
@@ -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`.
index e07051135779ac6344bf4ba4fee317964e54fa76..dd12e8220c456afe25e74ae2de971484a396bda9 100644 (file)
@@ -22,7 +22,7 @@ LL |     with_signature(x, |mut y| Box::new(y.next()))
                i32,
                extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#2r)>
            ]
-   = note: number of external vids: 3
+   = note: number of external vids: 4
    = note: where <T as std::iter::Iterator>::Item: '_#2r
 
 error[E0309]: the associated type `<T as std::iter::Iterator>::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<T>,)) -> std::boxed::Box<(dyn Anything + '_#2r)>
            ]
-   = note: number of external vids: 3
+   = note: number of external vids: 4
    = note: where <T as std::iter::Iterator>::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<T>,)) -> std::boxed::Box<(dyn Anything + '_#3r)>
            ]
-   = note: number of external vids: 4
+   = note: number of external vids: 5
    = note: where <T as std::iter::Iterator>::Item: '_#3r
 
 error[E0309]: the associated type `<T as std::iter::Iterator>::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<T>,)) -> std::boxed::Box<(dyn Anything + '_#3r)>
            ]
-   = note: number of external vids: 4
+   = note: number of external vids: 5
    = note: where <T as std::iter::Iterator>::Item: '_#3r
 
 note: No external requirements
index b84ee4de5a3cc953b6c7b0ffaca387e99146b9d0..456c52d3a51b84890f26f2344a5698870e939b3c 100644 (file)
@@ -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
 
index 42ecd6f986075130d1e6da857d4d502cd84b99ff..35c0405ff89e23388d578fb495689d70e9596e6a 100644 (file)
@@ -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
index 2552054fd5f423553516446fd04ae4f971f176c0..4e51a2bedc8c57d00ae0dbb66d2f8b725a5d31d7 100644 (file)
@@ -47,7 +47,7 @@ fn no_relationships_late<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T)
 {
     with_signature(cell, t, |cell, t| require(cell, t));
     //~^ WARNING not reporting region error due to nll
-    //~| ERROR associated type `<T as Anything<'_#5r, '_#6r>>::AssocType` may not live long enough
+    //~| ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
 }
 
 #[rustc_regions]
@@ -58,7 +58,7 @@ fn no_relationships_early<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T)
 {
     with_signature(cell, t, |cell, t| require(cell, t));
     //~^ WARNING not reporting region error due to nll
-    //~| ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
+    //~| ERROR associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
 }
 
 #[rustc_regions]
@@ -79,7 +79,7 @@ fn projection_outlives<'a, 'b, 'c, T>(cell: Cell<&'a ()>, t: T)
 
     with_signature(cell, t, |cell, t| require(cell, t));
     //~^ WARNING not reporting region error due to nll
-    //~| ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
+    //~| ERROR associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
 }
 
 #[rustc_regions]
index b0f823ad3d56b52500550c879b6219c433997943..a713971d17cb3954d4be3dc8ff6f4757fd3337f9 100644 (file)
@@ -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 <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#2r)>>::AssocType: '_#3r
 
-error[E0309]: the associated type `<T as Anything<'_#5r, '_#6r>>::AssocType` may not live long enough
+error[E0309]: the associated type `<T as Anything<'_#6r, '_#7r>>::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 `<T as Anything<'_#5r, '_#6r>>::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 `<T as Anything<'_#6r, '_#7r>>::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 `<T as Anything<'_#5r, '_#6r>>::AssocType` may not live long enough
+LL | |     //~| ERROR associated type `<T as Anything<'_#6r, '_#7r>>::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 <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r
 
-error[E0309]: the associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
+error[E0309]: the associated type `<T as Anything<'_#7r, '_#8r>>::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 `<T as Anything<'_#6r, '_#7r>>::AssocType: ReEarlyBound(0, 'a)`...
+   = help: consider adding an explicit lifetime bound `<T as Anything<'_#7r, '_#8r>>::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 `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
+LL | |     //~| ERROR associated type `<T as Anything<'_#7r, '_#8r>>::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 <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r
 
-error[E0309]: the associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
+error[E0309]: the associated type `<T as Anything<'_#7r, '_#8r>>::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 `<T as Anything<'_#6r, '_#7r>>::AssocType: ReEarlyBound(0, 'a)`...
+   = help: consider adding an explicit lifetime bound `<T as Anything<'_#7r, '_#8r>>::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 `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
+LL | |     //~| ERROR associated type `<T as Anything<'_#7r, '_#8r>>::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 <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::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 <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::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 <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#1r)>>::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 <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#2r)>>::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 <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#1r)>>::AssocType: '_#2r
 
 note: No external requirements
index 0ada3fb64ae80da3434b905e504091a59bda0647..39382df8d8a91433e6fe68ecfd9b0608ac7254b4 100644 (file)
@@ -27,7 +27,7 @@ LL |     twice(cell, value, |a, b| invoke(a, b));
                i16,
                for<'r, 's> extern "rust-call" fn((std::option::Option<std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) ()>>, &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<std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) ()>>, &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
index 39ad96cc6cd8e9ac47a75859080aadccc4a2df21..8babbe3fd97d2a6f0cb9f96272c9eca2120a909d 100644 (file)
@@ -22,7 +22,7 @@ LL |     with_signature(x, |y| y)
                i32,
                extern "rust-call" fn((std::boxed::Box<T>,)) -> 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
index a53ce21b7e6d22d253754d85fefe7279f65f2c84..b9426eba0f66d273e9383c616f33efffd36dd99c 100644 (file)
@@ -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