better names and a comment
This commit is contained in:
parent
c7b414adb6
commit
96d8011fa8
@ -441,8 +441,41 @@ fn compare_asyncness<'tcx>(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Given a method def-id in an impl, compare the method signature of the impl
|
||||||
|
/// against the trait that it's implementing. In doing so, infer the hidden types
|
||||||
|
/// that this method's signature provides to satisfy each return-position `impl Trait`
|
||||||
|
/// in the trait signature.
|
||||||
|
///
|
||||||
|
/// The method is also responsible for making sure that the hidden types for each
|
||||||
|
/// RPITIT actually satisfy the bounds of the `impl Trait`, i.e. that if we infer
|
||||||
|
/// `impl Trait = Foo`, that `Foo: Trait` holds.
|
||||||
|
///
|
||||||
|
/// For example, given the sample code:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(return_position_impl_trait_in_trait)]
|
||||||
|
///
|
||||||
|
/// use std::ops::Deref;
|
||||||
|
///
|
||||||
|
/// trait Foo {
|
||||||
|
/// fn bar() -> impl Deref<Target = impl Sized>;
|
||||||
|
/// // ^- RPITIT #1 ^- RPITIT #2
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// impl Foo for () {
|
||||||
|
/// fn bar() -> Box<String> { Box::new(String::new()) }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// The hidden types for the RPITITs in `bar` would be inferred to:
|
||||||
|
/// * `impl Deref` (RPITIT #1) = `Box<String>`
|
||||||
|
/// * `impl Sized` (RPITIT #2) = `String`
|
||||||
|
///
|
||||||
|
/// The relationship between these two types is straightforward in this case, but
|
||||||
|
/// may be more tenuously connected via other `impl`s and normalization rules for
|
||||||
|
/// cases of more complicated nested RPITITs.
|
||||||
#[instrument(skip(tcx), level = "debug", ret)]
|
#[instrument(skip(tcx), level = "debug", ret)]
|
||||||
pub(super) fn collect_trait_impl_trait_tys<'tcx>(
|
pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
def_id: DefId,
|
def_id: DefId,
|
||||||
) -> Result<&'tcx FxHashMap<DefId, Ty<'tcx>>, ErrorGuaranteed> {
|
) -> Result<&'tcx FxHashMap<DefId, Ty<'tcx>>, ErrorGuaranteed> {
|
||||||
|
@ -94,7 +94,7 @@ use std::num::NonZeroU32;
|
|||||||
use crate::require_c_abi_if_c_variadic;
|
use crate::require_c_abi_if_c_variadic;
|
||||||
use crate::util::common::indenter;
|
use crate::util::common::indenter;
|
||||||
|
|
||||||
use self::compare_impl_item::collect_trait_impl_trait_tys;
|
use self::compare_impl_item::collect_return_position_impl_trait_in_trait_tys;
|
||||||
use self::region::region_scope_tree;
|
use self::region::region_scope_tree;
|
||||||
|
|
||||||
pub fn provide(providers: &mut Providers) {
|
pub fn provide(providers: &mut Providers) {
|
||||||
@ -103,7 +103,7 @@ pub fn provide(providers: &mut Providers) {
|
|||||||
adt_destructor,
|
adt_destructor,
|
||||||
check_mod_item_types,
|
check_mod_item_types,
|
||||||
region_scope_tree,
|
region_scope_tree,
|
||||||
collect_trait_impl_trait_tys,
|
collect_return_position_impl_trait_in_trait_tys,
|
||||||
compare_impl_const: compare_impl_item::compare_impl_const_raw,
|
compare_impl_const: compare_impl_item::compare_impl_const_raw,
|
||||||
..*providers
|
..*providers
|
||||||
};
|
};
|
||||||
|
@ -223,7 +223,7 @@ provide! { tcx, def_id, other, cdata,
|
|||||||
generator_kind => { table }
|
generator_kind => { table }
|
||||||
trait_def => { table }
|
trait_def => { table }
|
||||||
deduced_param_attrs => { table }
|
deduced_param_attrs => { table }
|
||||||
collect_trait_impl_trait_tys => {
|
collect_return_position_impl_trait_in_trait_tys => {
|
||||||
Ok(cdata
|
Ok(cdata
|
||||||
.root
|
.root
|
||||||
.tables
|
.tables
|
||||||
|
@ -1197,7 +1197,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||||||
record!(self.tables.params_in_repr[def_id] <- params_in_repr);
|
record!(self.tables.params_in_repr[def_id] <- params_in_repr);
|
||||||
}
|
}
|
||||||
if should_encode_trait_impl_trait_tys(tcx, def_id)
|
if should_encode_trait_impl_trait_tys(tcx, def_id)
|
||||||
&& let Ok(table) = self.tcx.collect_trait_impl_trait_tys(def_id)
|
&& let Ok(table) = self.tcx.collect_return_position_impl_trait_in_trait_tys(def_id)
|
||||||
{
|
{
|
||||||
record!(self.tables.trait_impl_trait_tys[def_id] <- table);
|
record!(self.tables.trait_impl_trait_tys[def_id] <- table);
|
||||||
}
|
}
|
||||||
|
@ -169,7 +169,7 @@ rustc_queries! {
|
|||||||
separate_provide_extern
|
separate_provide_extern
|
||||||
}
|
}
|
||||||
|
|
||||||
query collect_trait_impl_trait_tys(key: DefId)
|
query collect_return_position_impl_trait_in_trait_tys(key: DefId)
|
||||||
-> Result<&'tcx FxHashMap<DefId, Ty<'tcx>>, ErrorGuaranteed>
|
-> Result<&'tcx FxHashMap<DefId, Ty<'tcx>>, ErrorGuaranteed>
|
||||||
{
|
{
|
||||||
desc { "comparing an impl and trait method signature, inferring any hidden `impl Trait` types in the process" }
|
desc { "comparing an impl and trait method signature, inferring any hidden `impl Trait` types in the process" }
|
||||||
|
@ -641,11 +641,11 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
ty::EarlyBinder(self.type_of(def_id))
|
ty::EarlyBinder(self.type_of(def_id))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn bound_trait_impl_trait_tys(
|
pub fn bound_return_position_impl_trait_in_trait_tys(
|
||||||
self,
|
self,
|
||||||
def_id: DefId,
|
def_id: DefId,
|
||||||
) -> ty::EarlyBinder<Result<&'tcx FxHashMap<DefId, Ty<'tcx>>, ErrorGuaranteed>> {
|
) -> ty::EarlyBinder<Result<&'tcx FxHashMap<DefId, Ty<'tcx>>, ErrorGuaranteed>> {
|
||||||
ty::EarlyBinder(self.collect_trait_impl_trait_tys(def_id))
|
ty::EarlyBinder(self.collect_return_position_impl_trait_in_trait_tys(def_id))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn bound_fn_sig(self, def_id: DefId) -> ty::EarlyBinder<ty::PolyFnSig<'tcx>> {
|
pub fn bound_fn_sig(self, def_id: DefId) -> ty::EarlyBinder<ty::PolyFnSig<'tcx>> {
|
||||||
|
@ -2284,7 +2284,7 @@ fn confirm_impl_trait_in_trait_candidate<'tcx>(
|
|||||||
obligation.param_env,
|
obligation.param_env,
|
||||||
cause.clone(),
|
cause.clone(),
|
||||||
obligation.recursion_depth + 1,
|
obligation.recursion_depth + 1,
|
||||||
tcx.bound_trait_impl_trait_tys(impl_fn_def_id)
|
tcx.bound_return_position_impl_trait_in_trait_tys(impl_fn_def_id)
|
||||||
.map_bound(|tys| {
|
.map_bound(|tys| {
|
||||||
tys.map_or_else(|_| tcx.ty_error(), |tys| tys[&obligation.predicate.def_id])
|
tys.map_or_else(|_| tcx.ty_error(), |tys| tys[&obligation.predicate.def_id])
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user