pub trait InferCtxtExt<'tcx> {
    // Required method
    fn infer_opaque_definition_from_instantiation(
        &self,
        opaque_type_key: OpaqueTypeKey<'tcx>,
        instantiated_ty: OpaqueHiddenType<'tcx>
    ) -> Ty<'tcx>;
}

Required Methods§

source

fn infer_opaque_definition_from_instantiation( &self, opaque_type_key: OpaqueTypeKey<'tcx>, instantiated_ty: OpaqueHiddenType<'tcx> ) -> Ty<'tcx>

Given the fully resolved, instantiated type for an opaque type, i.e., the value of an inference variable like C1 or C2 (*), computes the “definition type” for an opaque type definition – that is, the inferred value of Foo1<'x> or Foo2<'x> that we would conceptually use in its definition:

type Foo1<'x> = impl Bar<'x> = AAA;  // <-- this type AAA
type Foo2<'x> = impl Bar<'x> = BBB;  // <-- or this type BBB
fn foo<'a, 'b>(..) -> (Foo1<'a>, Foo2<'b>) { .. }

Note that these values are defined in terms of a distinct set of generic parameters ('x instead of 'a) from C1 or C2. The main purpose of this function is to do that translation.

(*) C1 and C2 were introduced in the comments on register_member_constraints. Read that comment for more context.

§Parameters
  • def_id, the impl Trait type
  • args, the args used to instantiate this opaque type
  • instantiated_ty, the inferred type C1 – fully resolved, lifted version of opaque_defn.concrete_ty

Implementations on Foreign Types§

source§

impl<'tcx> InferCtxtExt<'tcx> for InferCtxt<'tcx>

source§

fn infer_opaque_definition_from_instantiation( &self, opaque_type_key: OpaqueTypeKey<'tcx>, instantiated_ty: OpaqueHiddenType<'tcx> ) -> Ty<'tcx>

Given the fully resolved, instantiated type for an opaque type, i.e., the value of an inference variable like C1 or C2 (*), computes the “definition type” for an opaque type definition – that is, the inferred value of Foo1<'x> or Foo2<'x> that we would conceptually use in its definition:

type Foo1<'x> = impl Bar<'x> = AAA;  // <-- this type AAA
type Foo2<'x> = impl Bar<'x> = BBB;  // <-- or this type BBB
fn foo<'a, 'b>(..) -> (Foo1<'a>, Foo2<'b>) { .. }

Note that these values are defined in terms of a distinct set of generic parameters ('x instead of 'a) from C1 or C2. The main purpose of this function is to do that translation.

(*) C1 and C2 were introduced in the comments on register_member_constraints. Read that comment for more context.

§Parameters
  • def_id, the impl Trait type
  • args, the args used to instantiate this opaque type
  • instantiated_ty, the inferred type C1 – fully resolved, lifted version of opaque_defn.concrete_ty

Implementors§