@@ -441,8 +441,41 @@ fn compare_asyncness<'tcx>(
441441 Ok ( ( ) )
442442}
443443
444+ /// Given a method def-id in an impl, compare the method signature of the impl
445+ /// against the trait that it's implementing. In doing so, infer the hidden types
446+ /// that this method's signature provides to satisfy each return-position `impl Trait`
447+ /// in the trait signature.
448+ ///
449+ /// The method is also responsible for making sure that the hidden types for each
450+ /// RPITIT actually satisfy the bounds of the `impl Trait`, i.e. that if we infer
451+ /// `impl Trait = Foo`, that `Foo: Trait` holds.
452+ ///
453+ /// For example, given the sample code:
454+ ///
455+ /// ```
456+ /// #![feature(return_position_impl_trait_in_trait)]
457+ ///
458+ /// use std::ops::Deref;
459+ ///
460+ /// trait Foo {
461+ /// fn bar() -> impl Deref<Target = impl Sized>;
462+ /// // ^- RPITIT #1 ^- RPITIT #2
463+ /// }
464+ ///
465+ /// impl Foo for () {
466+ /// fn bar() -> Box<String> { Box::new(String::new()) }
467+ /// }
468+ /// ```
469+ ///
470+ /// The hidden types for the RPITITs in `bar` would be inferred to:
471+ /// * `impl Deref` (RPITIT #1) = `Box<String>`
472+ /// * `impl Sized` (RPITIT #2) = `String`
473+ ///
474+ /// The relationship between these two types is straightforward in this case, but
475+ /// may be more tenuously connected via other `impl`s and normalization rules for
476+ /// cases of more complicated nested RPITITs.
444477#[ instrument( skip( tcx) , level = "debug" , ret) ]
445- pub ( super ) fn collect_trait_impl_trait_tys < ' tcx > (
478+ pub ( super ) fn collect_return_position_impl_trait_in_trait_tys < ' tcx > (
446479 tcx : TyCtxt < ' tcx > ,
447480 def_id : DefId ,
448481) -> Result < & ' tcx FxHashMap < DefId , Ty < ' tcx > > , ErrorGuaranteed > {
0 commit comments