Auto merge of #53327 - wesleywiser:wip_optimize_nll, r=nikomatsakis

[nll] teach SCC about `'static`

r? @nikomatsakis

I think this is right? I am seeing better performance on the `html5ever` benchmark but I'd like a perf run to quantify the exact speedup. There's a few ui tests failing due to changes in the error messages. The main issue seems to be that returns aren't being detected correctly?

`mir_check_cast_unsize.rs` before:

```
error: unsatisfied lifetime constraints
  --> mir_check_cast_unsize.rs:17:46
   |
17 |   fn bar<'a>(x: &'a u32) -> &'static dyn Debug {
   |  ________--____________________________________^
   | |        |
   | |        lifetime `'a` defined here
18 | |     //~^ ERROR unsatisfied lifetime constraints
19 | |     x
20 | |     //~^ WARNING not reporting region error due to nll
21 | | }
   | |_^ return requires that `'a` must outlive `'static`
```

`mir_check_cast_unsize.rs` after:

```
error: unsatisfied lifetime constraints
  --> mir_check_cast_unsize.rs:19:5
   |
17 | fn bar<'a>(x: &'a u32) -> &'static dyn Debug {
   |        -- lifetime `'a` defined here
18 |     //~^ ERROR unsatisfied lifetime constraints
19 |     x
   |     ^ cast requires that `'a` must outlive `'static`
```
This commit is contained in:
bors 2018-09-07 17:56:23 +00:00
commit fc81e36242
39 changed files with 376 additions and 190 deletions

View file

@ -2567,6 +2567,13 @@ fn insert_late_bound_lifetimes(
// - do not appear in the where-clauses
// - are not implicitly captured by `impl Trait`
for param in &generics.params {
match param.kind {
hir::GenericParamKind::Lifetime { .. } => { /* fall through */ }
// Types are not late-bound.
hir::GenericParamKind::Type { .. } => continue,
}
let lt_name = hir::LifetimeName::Param(param.name.modern());
// appears in the where clauses? early-bound.
if appears_in_where_clause.regions.contains(&lt_name) {

View file

@ -8,6 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use borrow_check::nll::type_check::Locations;
use borrow_check::nll::constraints::{ConstraintIndex, ConstraintSet, OutlivesConstraint};
use rustc::ty::RegionVid;
use rustc_data_structures::graph;
@ -31,6 +32,7 @@ crate type ReverseConstraintGraph = ConstraintGraph<Reverse>;
crate trait ConstraintGraphDirecton: Copy + 'static {
fn start_region(c: &OutlivesConstraint) -> RegionVid;
fn end_region(c: &OutlivesConstraint) -> RegionVid;
fn is_normal() -> bool;
}
/// In normal mode, a `R1: R2` constraint results in an edge `R1 ->
@ -48,6 +50,10 @@ impl ConstraintGraphDirecton for Normal {
fn end_region(c: &OutlivesConstraint) -> RegionVid {
c.sub
}
fn is_normal() -> bool {
true
}
}
/// In reverse mode, a `R1: R2` constraint results in an edge `R2 ->
@ -65,6 +71,10 @@ impl ConstraintGraphDirecton for Reverse {
fn end_region(c: &OutlivesConstraint) -> RegionVid {
c.sup
}
fn is_normal() -> bool {
false
}
}
impl<D: ConstraintGraphDirecton> ConstraintGraph<D> {
@ -98,32 +108,74 @@ impl<D: ConstraintGraphDirecton> ConstraintGraph<D> {
/// Given the constraint set from which this graph was built
/// creates a region graph so that you can iterate over *regions*
/// and not constraints.
crate fn region_graph<'rg>(&'rg self, set: &'rg ConstraintSet) -> RegionGraph<'rg, D> {
RegionGraph::new(set, self)
crate fn region_graph<'rg>(
&'rg self,
set: &'rg ConstraintSet,
static_region: RegionVid,
) -> RegionGraph<'rg, D> {
RegionGraph::new(set, self, static_region)
}
/// Given a region `R`, iterate over all constraints `R: R1`.
crate fn outgoing_edges(&self, region_sup: RegionVid) -> Edges<'_, D> {
let first = self.first_constraints[region_sup];
Edges {
graph: self,
pointer: first,
crate fn outgoing_edges<'a>(
&'a self,
region_sup: RegionVid,
constraints: &'a ConstraintSet,
static_region: RegionVid,
) -> Edges<'a, D> {
//if this is the `'static` region and the graph's direction is normal,
//then setup the Edges iterator to return all regions #53178
if region_sup == static_region && D::is_normal() {
Edges {
graph: self,
constraints,
pointer: None,
next_static_idx: Some(0),
static_region,
}
} else {
//otherwise, just setup the iterator as normal
let first = self.first_constraints[region_sup];
Edges {
graph: self,
constraints,
pointer: first,
next_static_idx: None,
static_region,
}
}
}
}
crate struct Edges<'s, D: ConstraintGraphDirecton> {
graph: &'s ConstraintGraph<D>,
constraints: &'s ConstraintSet,
pointer: Option<ConstraintIndex>,
next_static_idx: Option<usize>,
static_region: RegionVid,
}
impl<'s, D: ConstraintGraphDirecton> Iterator for Edges<'s, D> {
type Item = ConstraintIndex;
type Item = OutlivesConstraint;
fn next(&mut self) -> Option<Self::Item> {
if let Some(p) = self.pointer {
self.pointer = self.graph.next_constraints[p];
Some(p)
Some(self.constraints[p])
} else if let Some(next_static_idx) = self.next_static_idx {
self.next_static_idx =
if next_static_idx == (self.graph.first_constraints.len() - 1) {
None
} else {
Some(next_static_idx + 1)
};
Some(OutlivesConstraint {
sup: self.static_region,
sub: next_static_idx.into(),
locations: Locations::All,
})
} else {
None
}
@ -136,6 +188,7 @@ impl<'s, D: ConstraintGraphDirecton> Iterator for Edges<'s, D> {
crate struct RegionGraph<'s, D: ConstraintGraphDirecton> {
set: &'s ConstraintSet,
constraint_graph: &'s ConstraintGraph<D>,
static_region: RegionVid,
}
impl<'s, D: ConstraintGraphDirecton> RegionGraph<'s, D> {
@ -143,10 +196,15 @@ impl<'s, D: ConstraintGraphDirecton> RegionGraph<'s, D> {
/// R2` is treated as an edge `R1 -> R2`. We use this graph to
/// construct SCCs for region inference but also for error
/// reporting.
crate fn new(set: &'s ConstraintSet, constraint_graph: &'s ConstraintGraph<D>) -> Self {
crate fn new(
set: &'s ConstraintSet,
constraint_graph: &'s ConstraintGraph<D>,
static_region: RegionVid,
) -> Self {
Self {
set,
constraint_graph,
static_region,
}
}
@ -154,14 +212,12 @@ impl<'s, D: ConstraintGraphDirecton> RegionGraph<'s, D> {
/// there exists a constraint `R: R1`.
crate fn outgoing_regions(&self, region_sup: RegionVid) -> Successors<'_, D> {
Successors {
set: self.set,
edges: self.constraint_graph.outgoing_edges(region_sup),
edges: self.constraint_graph.outgoing_edges(region_sup, self.set, self.static_region),
}
}
}
crate struct Successors<'s, D: ConstraintGraphDirecton> {
set: &'s ConstraintSet,
edges: Edges<'s, D>,
}
@ -169,7 +225,7 @@ impl<'s, D: ConstraintGraphDirecton> Iterator for Successors<'s, D> {
type Item = RegionVid;
fn next(&mut self) -> Option<Self::Item> {
self.edges.next().map(|c| D::end_region(&self.set[c]))
self.edges.next().map(|c| D::end_region(&c))
}
}

View file

@ -58,8 +58,9 @@ impl ConstraintSet {
crate fn compute_sccs(
&self,
constraint_graph: &graph::NormalConstraintGraph,
static_region: RegionVid,
) -> Sccs<RegionVid, ConstraintSccIndex> {
let region_graph = &constraint_graph.region_graph(self);
let region_graph = &constraint_graph.region_graph(self, static_region);
Sccs::new(region_graph)
}
}

View file

@ -8,7 +8,8 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use borrow_check::nll::region_infer::{ConstraintIndex, RegionInferenceContext};
use borrow_check::nll::constraints::OutlivesConstraint;
use borrow_check::nll::region_infer::RegionInferenceContext;
use borrow_check::nll::type_check::Locations;
use rustc::hir::def_id::DefId;
use rustc::infer::error_reporting::nice_region_error::NiceRegionError;
@ -53,7 +54,7 @@ impl fmt::Display for ConstraintCategory {
#[derive(Copy, Clone, PartialEq, Eq)]
enum Trace {
StartRegion,
FromConstraint(ConstraintIndex),
FromOutlivesConstraint(OutlivesConstraint),
NotVisited,
}
@ -80,12 +81,11 @@ impl<'tcx> RegionInferenceContext<'tcx> {
debug!(
"best_blame_constraint: path={:#?}",
path.iter()
.map(|&ci| format!(
"{:?}: {:?} ({:?}: {:?})",
ci,
&self.constraints[ci],
self.constraint_sccs.scc(self.constraints[ci].sup),
self.constraint_sccs.scc(self.constraints[ci].sub),
.map(|&c| format!(
"{:?} ({:?}: {:?})",
c,
self.constraint_sccs.scc(c.sup),
self.constraint_sccs.scc(c.sub),
))
.collect::<Vec<_>>()
);
@ -121,7 +121,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
// highlight (e.g., a call site or something).
let target_scc = self.constraint_sccs.scc(target_region);
let best_choice = (0..path.len()).rev().find(|&i| {
let constraint = &self.constraints[path[i]];
let constraint = path[i];
let constraint_sup_scc = self.constraint_sccs.scc(constraint.sup);
@ -164,7 +164,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
&self,
from_region: RegionVid,
target_test: impl Fn(RegionVid) -> bool,
) -> Option<(Vec<ConstraintIndex>, RegionVid)> {
) -> Option<(Vec<OutlivesConstraint>, RegionVid)> {
let mut context = IndexVec::from_elem(Trace::NotVisited, &self.definitions);
context[from_region] = Trace::StartRegion;
@ -185,9 +185,9 @@ impl<'tcx> RegionInferenceContext<'tcx> {
Trace::NotVisited => {
bug!("found unvisited region {:?} on path to {:?}", p, r)
}
Trace::FromConstraint(c) => {
Trace::FromOutlivesConstraint(c) => {
result.push(c);
p = self.constraints[c].sup;
p = c.sup;
}
Trace::StartRegion => {
@ -201,11 +201,14 @@ impl<'tcx> RegionInferenceContext<'tcx> {
// Otherwise, walk over the outgoing constraints and
// enqueue any regions we find, keeping track of how we
// reached them.
for constraint in self.constraint_graph.outgoing_edges(r) {
assert_eq!(self.constraints[constraint].sup, r);
let sub_region = self.constraints[constraint].sub;
let fr_static = self.universal_regions.fr_static;
for constraint in self.constraint_graph.outgoing_edges(r,
&self.constraints,
fr_static) {
assert_eq!(constraint.sup, r);
let sub_region = constraint.sub;
if let Trace::NotVisited = context[sub_region] {
context[sub_region] = Trace::FromConstraint(constraint);
context[sub_region] = Trace::FromOutlivesConstraint(constraint);
deque.push_back(sub_region);
}
}
@ -216,8 +219,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
/// This function will return true if a constraint is interesting and false if a constraint
/// is not. It is useful in filtering constraint paths to only interesting points.
fn constraint_is_interesting(&self, index: ConstraintIndex) -> bool {
let constraint = self.constraints[index];
fn constraint_is_interesting(&self, constraint: OutlivesConstraint) -> bool {
debug!(
"constraint_is_interesting: locations={:?} constraint={:?}",
constraint.locations, constraint
@ -232,11 +234,10 @@ impl<'tcx> RegionInferenceContext<'tcx> {
/// This function classifies a constraint from a location.
fn classify_constraint(
&self,
index: ConstraintIndex,
constraint: OutlivesConstraint,
mir: &Mir<'tcx>,
tcx: TyCtxt<'_, '_, 'tcx>,
) -> (ConstraintCategory, Span) {
let constraint = self.constraints[index];
debug!("classify_constraint: constraint={:?}", constraint);
let span = constraint.locations.span(mir);
let location = constraint
@ -244,7 +245,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
.from_location()
.unwrap_or(Location::START);
if !self.constraint_is_interesting(index) {
if !self.constraint_is_interesting(constraint) {
return (ConstraintCategory::Boring, span);
}

View file

@ -9,8 +9,8 @@
// except according to those terms.
use borrow_check::nll::region_infer::RegionInferenceContext;
use borrow_check::nll::ToRegionVid;
use borrow_check::nll::universal_regions::DefiningTy;
use borrow_check::nll::ToRegionVid;
use rustc::hir;
use rustc::hir::def_id::DefId;
use rustc::infer::InferCtxt;
@ -62,20 +62,26 @@ impl<'tcx> RegionInferenceContext<'tcx> {
assert!(self.universal_regions.is_universal_region(fr));
self.give_name_from_error_region(infcx.tcx, mir_def_id, fr, counter, diag)
let value = self.give_name_from_error_region(infcx.tcx, mir_def_id, fr, counter, diag)
.or_else(|| {
self.give_name_if_anonymous_region_appears_in_arguments(
infcx, mir, mir_def_id, fr, counter, diag)
infcx, mir, mir_def_id, fr, counter, diag,
)
})
.or_else(|| {
self.give_name_if_anonymous_region_appears_in_upvars(
infcx.tcx, mir, fr, counter, diag)
infcx.tcx, mir, fr, counter, diag,
)
})
.or_else(|| {
self.give_name_if_anonymous_region_appears_in_output(
infcx, mir, mir_def_id, fr, counter, diag)
infcx, mir, mir_def_id, fr, counter, diag,
)
})
.unwrap_or_else(|| span_bug!(mir.span, "can't make a name for free region {:?}", fr))
.unwrap_or_else(|| span_bug!(mir.span, "can't make a name for free region {:?}", fr));
debug!("give_region_a_name: gave name {:?}", value);
value
}
/// Check for the case where `fr` maps to something that the
@ -101,7 +107,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
} else {
None
}
},
}
ty::ReStatic => Some(keywords::StaticLifetime.name().as_interned_str()),
@ -109,15 +115,15 @@ impl<'tcx> RegionInferenceContext<'tcx> {
ty::BoundRegion::BrNamed(_, name) => {
self.highlight_named_span(tcx, error_region, &name, diag);
Some(name)
},
}
ty::BoundRegion::BrEnv => {
let mir_node_id = tcx.hir.as_local_node_id(mir_def_id).expect("non-local mir");
let def_ty = self.universal_regions.defining_ty;
if let DefiningTy::Closure(def_id, substs) = def_ty {
let args_span = if let hir::ExprKind::Closure(_, _, _, span, _)
= tcx.hir.expect_expr(mir_node_id).node
let args_span = if let hir::ExprKind::Closure(_, _, _, span, _) =
tcx.hir.expect_expr(mir_node_id).node
{
span
} else {
@ -195,16 +201,14 @@ impl<'tcx> RegionInferenceContext<'tcx> {
let node = tcx.hir.as_local_node_id(scope).unwrap_or(DUMMY_NODE_ID);
let mut sp = cm.def_span(tcx.hir.span(node));
if let Some(param) = tcx.hir.get_generics(scope).and_then(|generics| {
generics.get_named(name)
}) {
if let Some(param) = tcx.hir
.get_generics(scope)
.and_then(|generics| generics.get_named(name))
{
sp = param.span;
}
diag.span_label(
sp,
format!("lifetime `{}` defined here", name),
);
diag.span_label(sp, format!("lifetime `{}` defined here", name));
}
/// Find an argument that contains `fr` and label it with a fully
@ -242,14 +246,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
return Some(region_name);
}
self.give_name_if_we_cannot_match_hir_ty(
infcx,
mir,
fr,
arg_ty,
counter,
diag,
)
self.give_name_if_we_cannot_match_hir_ty(infcx, mir, fr, arg_ty, counter, diag)
}
fn give_name_if_we_can_match_hir_ty_from_argument(
@ -314,8 +311,10 @@ impl<'tcx> RegionInferenceContext<'tcx> {
infcx.extract_type_name(&argument_ty)
});
debug!("give_name_if_we_cannot_match_hir_ty: type_name={:?} needle_fr={:?}",
type_name, needle_fr);
debug!(
"give_name_if_we_cannot_match_hir_ty: type_name={:?} needle_fr={:?}",
type_name, needle_fr
);
let assigned_region_name = if type_name.find(&format!("'{}", counter)).is_some() {
// Only add a label if we can confirm that a region was labelled.
let argument_index = self.get_argument_index_for_region(infcx.tcx, needle_fr)?;
@ -547,13 +546,16 @@ impl<'tcx> RegionInferenceContext<'tcx> {
diag: &mut DiagnosticBuilder<'_>,
) -> Option<InternedString> {
let upvar_index = self.get_upvar_index_for_region(tcx, fr)?;
let (upvar_name, upvar_span) = self.get_upvar_name_and_span_for_region(tcx, mir,
upvar_index);
let (upvar_name, upvar_span) =
self.get_upvar_name_and_span_for_region(tcx, mir, upvar_index);
let region_name = self.synthesize_region_name(counter);
diag.span_label(
upvar_span,
format!("lifetime `{}` appears in the type of `{}`", region_name, upvar_name),
format!(
"lifetime `{}` appears in the type of `{}`",
region_name, upvar_name
),
);
Some(region_name)
@ -579,27 +581,33 @@ impl<'tcx> RegionInferenceContext<'tcx> {
"give_name_if_anonymous_region_appears_in_output: return_ty = {:?}",
return_ty
);
if !infcx.tcx.any_free_region_meets(&return_ty, |r| r.to_region_vid() == fr) {
if !infcx
.tcx
.any_free_region_meets(&return_ty, |r| r.to_region_vid() == fr)
{
return None;
}
let type_name = with_highlight_region(fr, *counter, || {
infcx.extract_type_name(&return_ty)
});
let type_name = with_highlight_region(fr, *counter, || infcx.extract_type_name(&return_ty));
let mir_node_id = tcx.hir.as_local_node_id(mir_def_id).expect("non-local mir");
let (return_span, mir_description) = if let hir::ExprKind::Closure(_, _, _, span, gen_move)
= tcx.hir.expect_expr(mir_node_id).node
{
(
tcx.sess.source_map().end_point(span),
if gen_move.is_some() { " of generator" } else { " of closure" }
)
} else {
// unreachable?
(mir.span, "")
};
let (return_span, mir_description) =
if let hir::ExprKind::Closure(_, _, _, span, gen_move) =
tcx.hir.expect_expr(mir_node_id).node
{
(
tcx.sess.source_map().end_point(span),
if gen_move.is_some() {
" of generator"
} else {
" of closure"
},
)
} else {
// unreachable?
(mir.span, "")
};
diag.span_label(
return_span,

View file

@ -11,7 +11,7 @@
use super::universal_regions::UniversalRegions;
use borrow_check::nll::constraints::graph::NormalConstraintGraph;
use borrow_check::nll::constraints::{
ConstraintIndex, ConstraintSccIndex, ConstraintSet, OutlivesConstraint,
ConstraintSccIndex, ConstraintSet, OutlivesConstraint,
};
use borrow_check::nll::region_infer::values::{RegionElement, ToElementIndex};
use borrow_check::nll::type_check::free_region_relations::UniversalRegionRelations;
@ -234,7 +234,8 @@ impl<'tcx> RegionInferenceContext<'tcx> {
let constraints = Rc::new(outlives_constraints); // freeze constraints
let constraint_graph = Rc::new(constraints.graph(definitions.len()));
let constraint_sccs = Rc::new(constraints.compute_sccs(&constraint_graph));
let fr_static = universal_regions.fr_static;
let constraint_sccs = Rc::new(constraints.compute_sccs(&constraint_graph, fr_static));
let mut scc_values = RegionValues::new(elements, universal_regions.len(), max_universe);

View file

@ -69,7 +69,8 @@ fn regions_that_outlive_free_regions(
// reachable from each free region, we will have all the
// regions that are forced to outlive some free region.
let rev_constraint_graph = constraint_set.reverse_graph(num_region_vars);
let rev_region_graph = rev_constraint_graph.region_graph(constraint_set);
let fr_static = universal_regions.fr_static;
let rev_region_graph = rev_constraint_graph.region_graph(constraint_set, fr_static);
// Stack for the depth-first search. Start out with all the free regions.
let mut stack: Vec<_> = universal_regions.universal_regions().collect();

View file

@ -241,8 +241,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); });
for_each_late_bound_region_defined_on(tcx, closure_base_def_id, |r| {
region_mapping.push(r);
});
assert_eq!(
region_mapping.len(),
@ -352,9 +353,8 @@ impl<'cx, 'gcx, 'tcx> UniversalRegionsBuilder<'cx, 'gcx, 'tcx> {
// 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)
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);
@ -371,9 +371,8 @@ impl<'cx, 'gcx, 'tcx> UniversalRegionsBuilder<'cx, 'gcx, 'tcx> {
// 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);
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();
@ -582,11 +581,10 @@ trait InferCtxtExt<'tcx> {
where
T: TypeFoldable<'tcx>;
fn replace_late_bound_regions_with_nll_infer_vars(
&self,
mir_def_id: DefId,
indices: &mut UniversalRegionIndices<'tcx>
indices: &mut UniversalRegionIndices<'tcx>,
);
}
@ -619,6 +617,7 @@ impl<'cx, 'gcx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'gcx, 'tcx> {
value, all_outlive_scope,
);
let (value, _map) = self.tcx.replace_late_bound_regions(value, |br| {
debug!("replace_bound_regions_with_nll_infer_vars: br={:?}", br);
let liberated_region = self.tcx.mk_region(ty::ReFree(ty::FreeRegion {
scope: all_outlive_scope,
bound_region: br,
@ -626,7 +625,7 @@ impl<'cx, 'gcx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'gcx, 'tcx> {
let region_vid = self.next_nll_region_var(origin);
indices.insert_late_bound_region(liberated_region, region_vid.to_region_vid());
debug!(
"liberated_region={:?} => {:?}",
"replace_bound_regions_with_nll_infer_vars: liberated_region={:?} => {:?}",
liberated_region, region_vid
);
region_vid
@ -648,12 +647,18 @@ impl<'cx, 'gcx, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'cx, 'gcx, 'tcx> {
mir_def_id: DefId,
indices: &mut UniversalRegionIndices<'tcx>,
) {
debug!(
"replace_late_bound_regions_with_nll_infer_vars(mir_def_id={:?})",
mir_def_id
);
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| {
debug!("replace_late_bound_regions_with_nll_infer_vars: r={:?}", 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());
}});
}
});
}
}
@ -703,11 +708,14 @@ impl<'tcx> UniversalRegionIndices<'tcx> {
fn for_each_late_bound_region_defined_on<'tcx>(
tcx: TyCtxt<'_, '_, 'tcx>,
fn_def_id: DefId,
mut f: impl FnMut(ty::Region<'tcx>)
) {
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 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);

View file

@ -34,7 +34,7 @@ fn main() {
// | '_#4r | Local | ['_#4r]
// |
// | Inferred Region Values
// | '_#0r | U0 | {bb0[0..=1], '_#0r}
// | '_#0r | U0 | {bb0[0..=1], '_#0r, '_#1r, '_#2r, '_#3r, '_#4r}
// | '_#1r | U0 | {bb0[0..=1], '_#1r}
// | '_#2r | U0 | {bb0[0..=1], '_#2r}
// | '_#3r | U0 | {bb0[0..=1], '_#3r}

View file

@ -6,5 +6,15 @@ LL | fn baz<'a,'b>(x: &'a u32) -> &'static u32 {
LL | bar(foo, x) //[transmute]~ ERROR E0495
| ^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
error: aborting due to previous error
error: unsatisfied lifetime constraints
--> $DIR/project-fn-ret-contravariant.rs:48:4
|
LL | fn baz<'a,'b>(x: &'a u32) -> &'static u32 {
| -- -- lifetime `'b` defined here
| |
| lifetime `'a` defined here
LL | bar(foo, x) //[transmute]~ ERROR E0495
| ^^^^^^^^^^^ requires that `'a` must outlive `'b`
error: aborting due to 2 previous errors

View file

@ -7,5 +7,16 @@ LL | fn baz<'a,'b>(x: Type<'a>) -> Type<'static> {
LL | bar(foo, x) //[transmute]~ ERROR E0495
| ^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
error: aborting due to previous error
error: unsatisfied lifetime constraints
--> $DIR/project-fn-ret-invariant.rs:58:13
|
LL | fn baz<'a,'b>(x: Type<'a>) -> Type<'static> {
| -- -- lifetime `'b` defined here
| |
| lifetime `'a` defined here
...
LL | bar(foo, x) //[transmute]~ ERROR E0495
| ^ requires that `'a` must outlive `'b`
error: aborting due to 2 previous errors

View file

@ -4,7 +4,7 @@ error: unsatisfied lifetime constraints
LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> {
| - let's call the lifetime of this reference `'1`
LL | self.x.iter().map(|a| a.0)
| ^^^^^^^^^^^^^ requires that `'1` must outlive `'static`
| ^^^^^^ cast requires that `'1` must outlive `'static`
error: unsatisfied lifetime constraints
--> $DIR/static-return-lifetime-infered.rs:21:9
@ -12,7 +12,7 @@ error: unsatisfied lifetime constraints
LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> {
| -- lifetime `'a` defined here
LL | self.x.iter().map(|a| a.0)
| ^^^^^^^^^^^^^ requires that `'a` must outlive `'static`
| ^^^^^^ cast requires that `'a` must outlive `'static`
error: aborting due to 2 previous errors

View file

@ -43,7 +43,8 @@ fn demand_y<'x, 'y>(_cell_x: &Cell<&'x u32>, _cell_y: &Cell<&'y u32>, _y: &'y u3
#[rustc_regions]
fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
establish_relationships(&cell_a, &cell_b, |_outlives, x, y| {
//~^ ERROR
//~^ ERROR borrowed data escapes outside of function
//~| ERROR unsatisfied lifetime constraints
// Only works if 'x: 'y:
demand_y(x, y, x.get())

View file

@ -3,7 +3,8 @@ note: External requirements
|
LL | establish_relationships(&cell_a, &cell_b, |_outlives, x, y| {
| _______________________________________________^
LL | | //~^ ERROR
LL | | //~^ ERROR borrowed data escapes outside of function
LL | | //~| ERROR unsatisfied lifetime constraints
LL | |
LL | | // Only works if 'x: 'y:
LL | | demand_y(x, y, x.get())
@ -22,8 +23,8 @@ note: No external requirements
|
LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
LL | | establish_relationships(&cell_a, &cell_b, |_outlives, x, y| {
LL | | //~^ ERROR
LL | |
LL | | //~^ ERROR borrowed data escapes outside of function
LL | | //~| ERROR unsatisfied lifetime constraints
... |
LL | | });
LL | | }
@ -37,12 +38,23 @@ error: borrowed data escapes outside of function
LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
| ------ `cell_a` is a reference that is only valid in the function body
LL | / establish_relationships(&cell_a, &cell_b, |_outlives, x, y| {
LL | | //~^ ERROR
LL | | //~^ ERROR borrowed data escapes outside of function
LL | | //~| ERROR unsatisfied lifetime constraints
LL | |
LL | | // Only works if 'x: 'y:
LL | | demand_y(x, y, x.get())
LL | | });
| |______^ `cell_a` escapes the function body here
error: aborting due to previous error
error: unsatisfied lifetime constraints
--> $DIR/propagate-approximated-shorter-to-static-no-bound.rs:45:29
|
LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
| -- -- lifetime `'b` defined here
| |
| lifetime `'a` defined here
LL | establish_relationships(&cell_a, &cell_b, |_outlives, x, y| {
| ^^^^^^^ requires that `'a` must outlive `'b`
error: aborting due to 2 previous errors

View file

@ -46,7 +46,8 @@ fn demand_y<'x, 'y>(_cell_x: &Cell<&'x u32>, _cell_y: &Cell<&'y u32>, _y: &'y u3
#[rustc_regions]
fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
//~^ ERROR
//~^ ERROR borrowed data escapes outside of function
//~| ERROR unsatisfied lifetime constraints
// Only works if 'x: 'y:
demand_y(x, y, x.get())
});

View file

@ -3,7 +3,8 @@ note: External requirements
|
LL | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
| _______________________________________________^
LL | | //~^ ERROR
LL | | //~^ ERROR borrowed data escapes outside of function
LL | | //~| ERROR unsatisfied lifetime constraints
LL | | // Only works if 'x: 'y:
LL | | demand_y(x, y, x.get())
LL | | });
@ -21,9 +22,9 @@ note: No external requirements
|
LL | / fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
LL | | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
LL | | //~^ ERROR
LL | | // Only works if 'x: 'y:
LL | | demand_y(x, y, x.get())
LL | | //~^ ERROR borrowed data escapes outside of function
LL | | //~| ERROR unsatisfied lifetime constraints
... |
LL | | });
LL | | }
| |_^
@ -36,11 +37,22 @@ error: borrowed data escapes outside of function
LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
| ------ `cell_a` is a reference that is only valid in the function body
LL | / establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
LL | | //~^ ERROR
LL | | //~^ ERROR borrowed data escapes outside of function
LL | | //~| ERROR unsatisfied lifetime constraints
LL | | // Only works if 'x: 'y:
LL | | demand_y(x, y, x.get())
LL | | });
| |______^ `cell_a` escapes the function body here
error: aborting due to previous error
error: unsatisfied lifetime constraints
--> $DIR/propagate-approximated-shorter-to-static-wrong-bound.rs:48:29
|
LL | fn supply<'a, 'b>(cell_a: Cell<&'a u32>, cell_b: Cell<&'b u32>) {
| -- -- lifetime `'b` defined here
| |
| lifetime `'a` defined here
LL | establish_relationships(&cell_a, &cell_b, |_outlives1, _outlives2, x, y| {
| ^^^^^^^ requires that `'a` must outlive `'b`
error: aborting due to 2 previous errors

View file

@ -17,7 +17,7 @@ LL | | });
i32,
extern "rust-call" fn((T,))
]
= note: number of external vids: 3
= note: number of external vids: 2
= note: where T: '_#1r
note: No external requirements

View file

@ -44,8 +44,8 @@ fn bar<'a>(x: &'a u32) -> &'static u32 {
// The MIR type checker must therefore relate `'?0` to `'?1` and `'?2`
// as part of checking the `ReifyFnPointer`.
let f: fn(_) -> _ = foo;
//~^ ERROR unsatisfied lifetime constraints
f(x)
//~^ ERROR
}
fn main() {}

View file

@ -1,11 +1,11 @@
error: unsatisfied lifetime constraints
--> $DIR/mir_check_cast_reify.rs:47:5
--> $DIR/mir_check_cast_reify.rs:46:25
|
LL | fn bar<'a>(x: &'a u32) -> &'static u32 {
| -- lifetime `'a` defined here
...
LL | f(x)
| ^^^^ returning this value requires that `'a` must outlive `'static`
LL | let f: fn(_) -> _ = foo;
| ^^^ cast requires that `'a` must outlive `'static`
error: aborting due to previous error

View file

@ -16,8 +16,8 @@ fn bar<'a>(input: &'a u32, f: fn(&'a u32) -> &'a u32) -> &'static u32 {
// Here the NLL checker must relate the types in `f` to the types
// in `g`. These are related via the `UnsafeFnPointer` cast.
let g: unsafe fn(_) -> _ = f;
//~^ ERROR unsatisfied lifetime constraints
unsafe { g(input) }
//~^ ERROR
}
fn main() {}

View file

@ -1,11 +1,11 @@
error: unsatisfied lifetime constraints
--> $DIR/mir_check_cast_unsafe_fn.rs:19:14
--> $DIR/mir_check_cast_unsafe_fn.rs:18:32
|
LL | fn bar<'a>(input: &'a u32, f: fn(&'a u32) -> &'a u32) -> &'static u32 {
| -- lifetime `'a` defined here
...
LL | unsafe { g(input) }
| ^^^^^^^^ returning this value requires that `'a` must outlive `'static`
LL | let g: unsafe fn(_) -> _ = f;
| ^ cast requires that `'a` must outlive `'static`
error: aborting due to previous error

View file

@ -4,7 +4,7 @@ error: unsatisfied lifetime constraints
LL | fn bar<'a>(x: &'a u32) -> &'static dyn Debug {
| -- lifetime `'a` defined here
LL | x
| ^ returning this value requires that `'a` must outlive `'static`
| ^ cast requires that `'a` must outlive `'static`
error: aborting due to previous error

View file

@ -10,7 +10,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: 4
= note: number of external vids: 3
= note: where <T as std::iter::Iterator>::Item: '_#2r
note: No external requirements
@ -50,7 +50,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: 4
= note: number of external vids: 3
= note: where <T as std::iter::Iterator>::Item: '_#2r
note: No external requirements
@ -82,7 +82,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: 5
= note: number of external vids: 4
= note: where <T as std::iter::Iterator>::Item: '_#3r
note: No external requirements
@ -124,7 +124,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: 5
= note: number of external vids: 4
= note: where <T as std::iter::Iterator>::Item: '_#3r
note: No external requirements

View file

@ -10,7 +10,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: 5
= note: number of external vids: 4
= note: where T: '_#2r
= note: where '_#1r: '_#2r
@ -63,7 +63,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: 5
= note: number of external vids: 4
= note: where T: '_#3r
= note: where '_#2r: '_#3r
@ -117,7 +117,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: 5
= note: number of external vids: 4
= note: where T: '_#3r
= note: where '_#2r: '_#3r
@ -171,7 +171,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: 5
= note: number of external vids: 4
= note: where T: '_#3r
= note: where '_#2r: '_#3r

View file

@ -10,7 +10,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: 5
= note: number of external vids: 4
= note: where '_#1r: '_#2r
note: No external requirements
@ -54,7 +54,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: 5
= note: number of external vids: 4
= note: where '_#2r: '_#3r
note: No external requirements
@ -99,7 +99,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: 5
= note: number of external vids: 4
= note: where '_#2r: '_#3r
note: No external requirements
@ -144,7 +144,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: 5
= note: number of external vids: 4
= note: where '_#2r: '_#3r
note: No external requirements
@ -177,7 +177,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: 4
= note: number of external vids: 3
= note: where '_#1r: '_#2r
note: No external requirements

View file

@ -46,7 +46,7 @@ where
T: Anything<'b, 'c>,
{
with_signature(cell, t, |cell, t| require(cell, t));
//~^ ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
//~^ ERROR associated type `<T as Anything<'_#5r, '_#6r>>::AssocType` may not live long enough
}
#[rustc_regions]
@ -56,7 +56,7 @@ where
'a: 'a,
{
with_signature(cell, t, |cell, t| require(cell, t));
//~^ ERROR associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
//~^ ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
}
#[rustc_regions]
@ -76,7 +76,7 @@ where
// can do better here with a more involved verification step.
with_signature(cell, t, |cell, t| require(cell, t));
//~^ ERROR associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
//~^ ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
}
#[rustc_regions]
@ -103,7 +103,7 @@ where
T: Anything<'b, 'b>,
{
with_signature(cell, t, |cell, t| require(cell, t));
//~^ ERROR
//~^ ERROR unsatisfied lifetime constraints
}
#[rustc_regions]

View file

@ -11,7 +11,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: 6
= note: number of external vids: 5
= note: where <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#2r)>>::AssocType: '_#3r
note: No external requirements
@ -22,7 +22,7 @@ LL | | where
LL | | T: Anything<'b, 'c>,
LL | | {
LL | | with_signature(cell, t, |cell, t| require(cell, t));
LL | | //~^ ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
LL | | //~^ ERROR associated type `<T as Anything<'_#5r, '_#6r>>::AssocType` may not live long enough
LL | | }
| |_^
|
@ -32,13 +32,13 @@ LL | | }
T
]
error[E0309]: the associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
error[E0309]: the associated type `<T as Anything<'_#5r, '_#6r>>::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<'_#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))`...
= 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))`...
note: External requirements
--> $DIR/projection-two-region-trait-bound-closure.rs:58:29
@ -54,7 +54,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: 6
= note: number of external vids: 5
= note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r
note: No external requirements
@ -65,7 +65,7 @@ LL | | where
LL | | T: Anything<'b, 'c>,
LL | | 'a: 'a,
... |
LL | | //~^ ERROR associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
LL | | //~^ ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
LL | | }
| |_^
|
@ -76,13 +76,13 @@ LL | | }
T
]
error[E0309]: the associated type `<T as Anything<'_#7r, '_#8r>>::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:58:29
|
LL | with_signature(cell, t, |cell, t| require(cell, t));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider adding an explicit lifetime bound `<T as Anything<'_#7r, '_#8r>>::AssocType: ReEarlyBound(0, 'a)`...
= help: consider adding an explicit lifetime bound `<T as Anything<'_#6r, '_#7r>>::AssocType: ReEarlyBound(0, 'a)`...
note: External requirements
--> $DIR/projection-two-region-trait-bound-closure.rs:78:29
@ -98,7 +98,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: 6
= note: number of external vids: 5
= note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r
note: No external requirements
@ -109,7 +109,7 @@ LL | | where
LL | | T: Anything<'b, 'c>,
LL | | T::AssocType: 'a,
... |
LL | | //~^ ERROR associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
LL | | //~^ ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
LL | | }
| |_^
|
@ -120,13 +120,13 @@ LL | | }
T
]
error[E0309]: the associated type `<T as Anything<'_#7r, '_#8r>>::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:78:29
|
LL | with_signature(cell, t, |cell, t| require(cell, t));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider adding an explicit lifetime bound `<T as Anything<'_#7r, '_#8r>>::AssocType: ReEarlyBound(0, 'a)`...
= help: consider adding an explicit lifetime bound `<T as Anything<'_#6r, '_#7r>>::AssocType: ReEarlyBound(0, 'a)`...
note: External requirements
--> $DIR/projection-two-region-trait-bound-closure.rs:88:29
@ -142,7 +142,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: 6
= note: number of external vids: 5
= note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r
note: No external requirements
@ -178,7 +178,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: 6
= note: number of external vids: 5
= note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r
note: No external requirements
@ -212,7 +212,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: 5
= note: number of external vids: 4
= note: where <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#1r)>>::AssocType: '_#2r
note: No external requirements
@ -223,7 +223,7 @@ LL | | where
LL | | T: Anything<'b, 'b>,
LL | | {
LL | | with_signature(cell, t, |cell, t| require(cell, t));
LL | | //~^ ERROR
LL | | //~^ ERROR unsatisfied lifetime constraints
LL | | }
| |_^
|
@ -256,7 +256,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: 5
= note: number of external vids: 4
= note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#2r)>>::AssocType: '_#3r
note: No external requirements
@ -289,7 +289,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: 4
= note: number of external vids: 3
= note: where <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#1r)>>::AssocType: '_#2r
note: No external requirements

View file

@ -9,7 +9,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: 3
= note: number of external vids: 2
= note: where T: '_#1r
note: No external requirements
@ -36,7 +36,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: 4
= note: number of external vids: 3
= note: where T: '_#1r
note: No external requirements

View file

@ -10,7 +10,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: 4
= note: number of external vids: 3
= note: where T: '_#2r
note: No external requirements

View file

@ -16,7 +16,7 @@ LL | | })
i32,
extern "rust-call" fn((std::cell::Cell<&'_#1r ()>, T))
]
= note: number of external vids: 4
= note: number of external vids: 3
= note: where T: '_#1r
note: No external requirements
@ -69,7 +69,7 @@ LL | | })
i32,
extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T))
]
= note: number of external vids: 4
= note: number of external vids: 3
= note: where T: '_#2r
note: No external requirements
@ -106,7 +106,7 @@ LL | | })
i32,
extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T))
]
= note: number of external vids: 5
= note: number of external vids: 4
= note: where T: '_#2r
note: No external requirements
@ -156,7 +156,7 @@ LL | | })
i32,
extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T))
]
= note: number of external vids: 5
= note: number of external vids: 4
= note: where T: '_#3r
note: No external requirements

View file

@ -1,10 +1,10 @@
error: unsatisfied lifetime constraints
--> $DIR/regions-addr-of-self.rs:17:37
--> $DIR/regions-addr-of-self.rs:17:13
|
LL | pub fn chase_cat(&mut self) {
| - let's call the lifetime of this reference `'1`
LL | let p: &'static mut usize = &mut self.cats_chased; //~ ERROR cannot infer
| ^^^^^^^^^^^^^^^^^^^^^ requires that `'1` must outlive `'static`
| ^ requires that `'1` must outlive `'static`
error: aborting due to previous error

View file

@ -1,10 +1,22 @@
error: unsatisfied lifetime constraints
--> $DIR/regions-addr-of-upvar-self.rs:20:41
--> $DIR/regions-addr-of-upvar-self.rs:20:17
|
LL | let _f = || {
| -- lifetime `'1` represents this closure's body
LL | let p: &'static mut usize = &mut self.food; //~ ERROR cannot infer
| ^^^^^^^^^^^^^^ requires that `'1` must outlive `'static`
| ^ requires that `'1` must outlive `'static`
|
= note: closure implements `FnMut`, so references to captured variables can't escape the closure
error: unsatisfied lifetime constraints
--> $DIR/regions-addr-of-upvar-self.rs:20:17
|
LL | pub fn chase_cat(&mut self) {
| --------- lifetime `'2` appears in the type of `self`
LL | let _f = || {
| -- lifetime `'1` represents this closure's body
LL | let p: &'static mut usize = &mut self.food; //~ ERROR cannot infer
| ^ requires that `'1` must outlive `'2`
|
= note: closure implements `FnMut`, so references to captured variables can't escape the closure
@ -29,6 +41,6 @@ LL | }
|
= note: borrowed value must be valid for the static lifetime...
error: aborting due to 3 previous errors
error: aborting due to 4 previous errors
For more information about this error, try `rustc --explain E0597`.

View file

@ -1,10 +1,10 @@
error: unsatisfied lifetime constraints
--> $DIR/regions-close-object-into-object-2.rs:20:5
--> $DIR/regions-close-object-into-object-2.rs:20:11
|
LL | fn g<'a, T: 'static>(v: Box<A<T>+'a>) -> Box<X+'static> {
| -- lifetime `'a` defined here
LL | box B(&*v) as Box<X> //~ ERROR cannot infer
| ^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
| ^^^ cast requires that `'a` must outlive `'static`
error[E0597]: `*v` does not live long enough
--> $DIR/regions-close-object-into-object-2.rs:20:11

View file

@ -6,14 +6,6 @@ LL | box B(&*v) as Box<X> //~ ERROR cannot infer
|
= help: consider adding an explicit lifetime bound `U: 'static`...
error: unsatisfied lifetime constraints
--> $DIR/regions-close-object-into-object-4.rs:20:5
|
LL | fn i<'a, T, U>(v: Box<A<U>+'a>) -> Box<X+'static> {
| -- lifetime `'a` defined here
LL | box B(&*v) as Box<X> //~ ERROR cannot infer
| ^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'a` must outlive `'static`
error[E0310]: the parameter type `U` may not live long enough
--> $DIR/regions-close-object-into-object-4.rs:20:9
|
@ -22,6 +14,14 @@ LL | box B(&*v) as Box<X> //~ ERROR cannot infer
|
= help: consider adding an explicit lifetime bound `U: 'static`...
error: unsatisfied lifetime constraints
--> $DIR/regions-close-object-into-object-4.rs:20:11
|
LL | fn i<'a, T, U>(v: Box<A<U>+'a>) -> Box<X+'static> {
| -- lifetime `'a` defined here
LL | box B(&*v) as Box<X> //~ ERROR cannot infer
| ^^^ cast requires that `'a` must outlive `'static`
error[E0597]: `*v` does not live long enough
--> $DIR/regions-close-object-into-object-4.rs:20:11
|

View file

@ -15,7 +15,7 @@ LL | static_id(&u); //[ll]~ ERROR explicit lifetime required in the type of
| ^^^^^^^^^^^^^ lifetime `'static` required
error[E0621]: explicit lifetime required in the type of `v`
--> $DIR/regions-static-bound.rs:26:5
--> $DIR/regions-static-bound.rs:27:5
|
LL | fn error(u: &(), v: &()) {
| --- help: add explicit lifetime `'static` to the type of `v`: `&'static ()`
@ -23,6 +23,27 @@ LL | fn error(u: &(), v: &()) {
LL | static_id_indirect(&v); //[ll]~ ERROR explicit lifetime required in the type of `v` [E0621]
| ^^^^^^^^^^^^^^^^^^^^^^ lifetime `'static` required
error: aborting due to 3 previous errors
error: unsatisfied lifetime constraints
--> $DIR/regions-static-bound.rs:24:5
|
LL | fn error(u: &(), v: &()) {
| - - let's call the lifetime of this reference `'2`
| |
| let's call the lifetime of this reference `'1`
LL | static_id(&u); //[ll]~ ERROR explicit lifetime required in the type of `u` [E0621]
| ^^^^^^^^^^^^^ argument requires that `'1` must outlive `'2`
error: unsatisfied lifetime constraints
--> $DIR/regions-static-bound.rs:27:5
|
LL | fn error(u: &(), v: &()) {
| - - let's call the lifetime of this reference `'1`
| |
| let's call the lifetime of this reference `'2`
...
LL | static_id_indirect(&v); //[ll]~ ERROR explicit lifetime required in the type of `v` [E0621]
| ^^^^^^^^^^^^^^^^^^^^^^ argument requires that `'1` must outlive `'2`
error: aborting due to 5 previous errors
For more information about this error, try `rustc --explain E0621`.

View file

@ -20,7 +20,7 @@ LL | static_id(&u); //[ll]~ ERROR explicit lifetime required in the type of
| ^^^^^^^^^ lifetime `'static` required
error[E0621]: explicit lifetime required in the type of `v`
--> $DIR/regions-static-bound.rs:26:5
--> $DIR/regions-static-bound.rs:27:5
|
LL | fn error(u: &(), v: &()) {
| --- help: add explicit lifetime `'static` to the type of `v`: `&'static ()`

View file

@ -15,7 +15,7 @@ LL | static_id(&u); //[ll]~ ERROR explicit lifetime required in the type of
| ^^^^^^^^^^^^^ lifetime `'static` required
error[E0621]: explicit lifetime required in the type of `v`
--> $DIR/regions-static-bound.rs:26:5
--> $DIR/regions-static-bound.rs:27:5
|
LL | fn error(u: &(), v: &()) {
| --- help: add explicit lifetime `'static` to the type of `v`: `&'static ()`
@ -23,6 +23,27 @@ LL | fn error(u: &(), v: &()) {
LL | static_id_indirect(&v); //[ll]~ ERROR explicit lifetime required in the type of `v` [E0621]
| ^^^^^^^^^^^^^^^^^^^^^^ lifetime `'static` required
error: aborting due to 3 previous errors
error: unsatisfied lifetime constraints
--> $DIR/regions-static-bound.rs:24:5
|
LL | fn error(u: &(), v: &()) {
| - - let's call the lifetime of this reference `'2`
| |
| let's call the lifetime of this reference `'1`
LL | static_id(&u); //[ll]~ ERROR explicit lifetime required in the type of `u` [E0621]
| ^^^^^^^^^^^^^ argument requires that `'1` must outlive `'2`
error: unsatisfied lifetime constraints
--> $DIR/regions-static-bound.rs:27:5
|
LL | fn error(u: &(), v: &()) {
| - - let's call the lifetime of this reference `'1`
| |
| let's call the lifetime of this reference `'2`
...
LL | static_id_indirect(&v); //[ll]~ ERROR explicit lifetime required in the type of `v` [E0621]
| ^^^^^^^^^^^^^^^^^^^^^^ argument requires that `'1` must outlive `'2`
error: aborting due to 5 previous errors
For more information about this error, try `rustc --explain E0621`.

View file

@ -23,8 +23,10 @@ fn static_id_wrong_way<'a>(t: &'a ()) -> &'static () where 'static: 'a {
fn error(u: &(), v: &()) {
static_id(&u); //[ll]~ ERROR explicit lifetime required in the type of `u` [E0621]
//[nll]~^ ERROR explicit lifetime required in the type of `u` [E0621]
//[nll]~| ERROR unsatisfied lifetime constraints
static_id_indirect(&v); //[ll]~ ERROR explicit lifetime required in the type of `v` [E0621]
//[nll]~^ ERROR explicit lifetime required in the type of `v` [E0621]
//[nll]~| ERROR unsatisfied lifetime constraints
}
fn main() {}

View file

@ -5,7 +5,7 @@ LL | fn a<T>(items: &[T]) -> Box<dyn Iterator<Item=&T>> {
| - let's call the lifetime of this reference `'1`
LL | // ^^^^^^^^^^^^^^^^^^^^^ bound *here* defaults to `'static`
LL | Box::new(items.iter()) //~ ERROR cannot infer an appropriate lifetime
| ^^^^^^^^^^^^^^^^^^^^^^ returning this value requires that `'1` must outlive `'static`
| ^^^^^^^^^^^^^^^^^^^^^^ cast requires that `'1` must outlive `'static`
error: aborting due to previous error