diff --git a/compiler/rustc_infer/src/infer/opaque_types.rs b/compiler/rustc_infer/src/infer/opaque_types.rs index 4a1cbf597db..d0883f23a4e 100644 --- a/compiler/rustc_infer/src/infer/opaque_types.rs +++ b/compiler/rustc_infer/src/infer/opaque_types.rs @@ -42,29 +42,6 @@ pub struct OpaqueTypeDecl<'tcx> { /// lifetime parameter on `foo`.) pub concrete_ty: Ty<'tcx>, - /// Returns `true` if the `impl Trait` bounds include region bounds. - /// For example, this would be true for: - /// - /// fn foo<'a, 'b, 'c>() -> impl Trait<'c> + 'a + 'b - /// - /// but false for: - /// - /// fn foo<'c>() -> impl Trait<'c> - /// - /// unless `Trait` was declared like: - /// - /// trait Trait<'c>: 'c - /// - /// in which case it would be true. - /// - /// This is used during regionck to decide whether we need to - /// impose any additional constraints to ensure that region - /// variables in `concrete_ty` wind up being constrained to - /// something from `substs` (or, at minimum, things that outlive - /// the fn body). (Ultimately, writeback is responsible for this - /// check.) - pub has_required_region_bounds: bool, - /// The origin of the opaque type. pub origin: hir::OpaqueTyOrigin, } diff --git a/compiler/rustc_trait_selection/src/opaque_types.rs b/compiler/rustc_trait_selection/src/opaque_types.rs index 5ff1cf777f9..4268fa03584 100644 --- a/compiler/rustc_trait_selection/src/opaque_types.rs +++ b/compiler/rustc_trait_selection/src/opaque_types.rs @@ -330,19 +330,36 @@ fn constrain_opaque_type>( let span = tcx.def_span(def_id); - // If there are required region bounds, we can use them. - if opaque_defn.has_required_region_bounds { - let bounds = tcx.explicit_item_bounds(def_id); - debug!("{:#?}", bounds); - let bounds: Vec<_> = - bounds.iter().map(|(bound, _)| bound.subst(tcx, opaque_type_key.substs)).collect(); - debug!("{:#?}", bounds); - let opaque_type = tcx.mk_opaque(def_id, opaque_type_key.substs); - - let required_region_bounds = - required_region_bounds(tcx, opaque_type, bounds.into_iter()); - debug_assert!(!required_region_bounds.is_empty()); + // Check if the `impl Trait` bounds include region bounds. + // For example, this would be true for: + // + // fn foo<'a, 'b, 'c>() -> impl Trait<'c> + 'a + 'b + // + // but false for: + // + // fn foo<'c>() -> impl Trait<'c> + // + // unless `Trait` was declared like: + // + // trait Trait<'c>: 'c + // + // in which case it would be true. + // + // This is used during regionck to decide whether we need to + // impose any additional constraints to ensure that region + // variables in `concrete_ty` wind up being constrained to + // something from `substs` (or, at minimum, things that outlive + // the fn body). (Ultimately, writeback is responsible for this + // check.) + let bounds = tcx.explicit_item_bounds(def_id); + debug!("{:#?}", bounds); + let bounds: Vec<_> = + bounds.iter().map(|(bound, _)| bound.subst(tcx, opaque_type_key.substs)).collect(); + debug!("{:#?}", bounds); + let opaque_type = tcx.mk_opaque(def_id, opaque_type_key.substs); + let required_region_bounds = required_region_bounds(tcx, opaque_type, bounds.into_iter()); + if !required_region_bounds.is_empty() { for required_region in required_region_bounds { concrete_ty.visit_with(&mut ConstrainOpaqueTypeRegionVisitor { op: |r| self.sub_regions(infer::CallReturn(span), required_region, r), @@ -979,9 +996,6 @@ fn fold_opaque_ty( debug!("instantiate_opaque_types: bounds={:?}", bounds); - let required_region_bounds = required_region_bounds(tcx, ty, bounds.iter().copied()); - debug!("instantiate_opaque_types: required_region_bounds={:?}", required_region_bounds); - // Make sure that we are in fact defining the *entire* type // (e.g., `type Foo = impl Bar;` needs to be // defined by a function like `fn foo() -> Foo`). @@ -997,13 +1011,7 @@ fn fold_opaque_ty( self.opaque_types.insert( OpaqueTypeKey { def_id, substs }, - OpaqueTypeDecl { - opaque_type: ty, - definition_span, - concrete_ty: ty_var, - has_required_region_bounds: !required_region_bounds.is_empty(), - origin, - }, + OpaqueTypeDecl { opaque_type: ty, definition_span, concrete_ty: ty_var, origin }, ); debug!("instantiate_opaque_types: ty_var={:?}", ty_var);