mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 23:34:48 +00:00
Always use the stronger outlives version for opaque types
This commit is contained in:
parent
16e356ebdf
commit
664c8ed301
@ -284,18 +284,40 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
debug!("constrain_opaque_type: def_id={:?}", def_id);
|
||||
debug!("constrain_opaque_type: opaque_defn={:#?}", opaque_defn);
|
||||
|
||||
let tcx = self.tcx;
|
||||
|
||||
let concrete_ty = self.resolve_type_vars_if_possible(&opaque_defn.concrete_ty);
|
||||
|
||||
debug!("constrain_opaque_type: concrete_ty={:?}", concrete_ty);
|
||||
|
||||
let abstract_type_generics = self.tcx.generics_of(def_id);
|
||||
let abstract_type_generics = tcx.generics_of(def_id);
|
||||
|
||||
let span = self.tcx.def_span(def_id);
|
||||
let span = tcx.def_span(def_id);
|
||||
|
||||
// If there are required region bounds, we can just skip
|
||||
// ahead. There will already be a registered region
|
||||
// obligation related `concrete_ty` to those regions.
|
||||
// If there are required region bounds, we can use them.
|
||||
if opaque_defn.has_required_region_bounds {
|
||||
let predicates_of = tcx.predicates_of(def_id);
|
||||
debug!(
|
||||
"constrain_opaque_type: predicates: {:#?}",
|
||||
predicates_of,
|
||||
);
|
||||
let bounds = predicates_of.instantiate(tcx, opaque_defn.substs);
|
||||
debug!("constrain_opaque_type: bounds={:#?}", bounds);
|
||||
let opaque_type = tcx.mk_opaque(def_id, opaque_defn.substs);
|
||||
|
||||
let required_region_bounds = tcx.required_region_bounds(
|
||||
opaque_type,
|
||||
bounds.predicates.clone(),
|
||||
);
|
||||
debug_assert!(!required_region_bounds.is_empty());
|
||||
|
||||
for region in required_region_bounds {
|
||||
concrete_ty.visit_with(&mut OpaqueTypeOutlivesVisitor {
|
||||
infcx: self,
|
||||
least_region: region,
|
||||
span,
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -371,7 +393,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
let least_region = least_region.unwrap_or(self.tcx.lifetimes.re_static);
|
||||
let least_region = least_region.unwrap_or(tcx.lifetimes.re_static);
|
||||
debug!("constrain_opaque_types: least_region={:?}", least_region);
|
||||
|
||||
concrete_ty.visit_with(&mut OpaqueTypeOutlivesVisitor {
|
||||
|
@ -16,4 +16,8 @@ fn make_identity() -> impl Sized {
|
||||
|x: &'static i32| x
|
||||
}
|
||||
|
||||
fn make_identity_static() -> impl Sized + 'static {
|
||||
|x: &'static i32| x
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -17,6 +17,13 @@ fn wrapped_closure() -> impl Sized {
|
||||
A(f)
|
||||
}
|
||||
|
||||
fn wrapped_closure_with_bound() -> impl Sized + 'static {
|
||||
let f = |x| x;
|
||||
f(&0);
|
||||
A(f)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let x: Box<dyn Send> = Box::new(wrapped_closure());
|
||||
let y: Box<dyn Send> = Box::new(wrapped_closure_with_bound());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user