Add bound_impl_trait_ref
This commit is contained in:
parent
6c05e8d009
commit
0247faed29
@ -1,5 +1,5 @@
|
|||||||
use crate::ty::subst::{GenericArg, Subst};
|
use crate::ty::subst::{GenericArg, Subst};
|
||||||
use crate::ty::{self, DefIdTree, EarlyBinder, Ty, TyCtxt};
|
use crate::ty::{self, DefIdTree, Ty, TyCtxt};
|
||||||
|
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_data_structures::sso::SsoHashSet;
|
use rustc_data_structures::sso::SsoHashSet;
|
||||||
@ -116,14 +116,14 @@ fn default_print_def_path(
|
|||||||
DefPathData::Impl => {
|
DefPathData::Impl => {
|
||||||
let generics = self.tcx().generics_of(def_id);
|
let generics = self.tcx().generics_of(def_id);
|
||||||
let self_ty = self.tcx().bound_type_of(def_id);
|
let self_ty = self.tcx().bound_type_of(def_id);
|
||||||
let impl_trait_ref = self.tcx().impl_trait_ref(def_id);
|
let impl_trait_ref = self.tcx().bound_impl_trait_ref(def_id);
|
||||||
let (self_ty, impl_trait_ref) = if substs.len() >= generics.count() {
|
let (self_ty, impl_trait_ref) = if substs.len() >= generics.count() {
|
||||||
(
|
(
|
||||||
self_ty.subst(self.tcx(), substs),
|
self_ty.subst(self.tcx(), substs),
|
||||||
EarlyBinder(impl_trait_ref).subst(self.tcx(), substs),
|
impl_trait_ref.map(|i| i.subst(self.tcx(), substs)),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
(self_ty.0, impl_trait_ref)
|
(self_ty.0, impl_trait_ref.map(|i| i.0))
|
||||||
};
|
};
|
||||||
self.print_impl_path(def_id, substs, self_ty, impl_trait_ref)
|
self.print_impl_path(def_id, substs, self_ty, impl_trait_ref)
|
||||||
}
|
}
|
||||||
|
@ -600,6 +600,10 @@ pub fn bound_type_of(self, def_id: DefId) -> EarlyBinder<Ty<'tcx>> {
|
|||||||
pub fn bound_fn_sig(self, def_id: DefId) -> EarlyBinder<ty::PolyFnSig<'tcx>> {
|
pub fn bound_fn_sig(self, def_id: DefId) -> EarlyBinder<ty::PolyFnSig<'tcx>> {
|
||||||
EarlyBinder(self.fn_sig(def_id))
|
EarlyBinder(self.fn_sig(def_id))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn bound_impl_trait_ref(self, def_id: DefId) -> Option<EarlyBinder<ty::TraitRef<'tcx>>> {
|
||||||
|
self.impl_trait_ref(def_id).map(|i| EarlyBinder(i))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct OpaqueTypeExpander<'tcx> {
|
struct OpaqueTypeExpander<'tcx> {
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
use rustc_middle::ty::fast_reject::{self, TreatParams};
|
use rustc_middle::ty::fast_reject::{self, TreatParams};
|
||||||
use rustc_middle::ty::fold::TypeFoldable;
|
use rustc_middle::ty::fold::TypeFoldable;
|
||||||
use rustc_middle::ty::subst::Subst;
|
use rustc_middle::ty::subst::Subst;
|
||||||
use rustc_middle::ty::{self, EarlyBinder, ImplSubject, Ty, TyCtxt};
|
use rustc_middle::ty::{self, ImplSubject, Ty, TyCtxt};
|
||||||
use rustc_span::symbol::sym;
|
use rustc_span::symbol::sym;
|
||||||
use rustc_span::DUMMY_SP;
|
use rustc_span::DUMMY_SP;
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
@ -136,7 +136,7 @@ fn with_fresh_ty_vars<'cx, 'tcx>(
|
|||||||
let header = ty::ImplHeader {
|
let header = ty::ImplHeader {
|
||||||
impl_def_id,
|
impl_def_id,
|
||||||
self_ty: tcx.bound_type_of(impl_def_id).subst(tcx, impl_substs),
|
self_ty: tcx.bound_type_of(impl_def_id).subst(tcx, impl_substs),
|
||||||
trait_ref: EarlyBinder(tcx.impl_trait_ref(impl_def_id)).subst(tcx, impl_substs),
|
trait_ref: tcx.bound_impl_trait_ref(impl_def_id).map(|i| i.subst(tcx, impl_substs)),
|
||||||
predicates: tcx.predicates_of(impl_def_id).instantiate(tcx, impl_substs).predicates,
|
predicates: tcx.predicates_of(impl_def_id).instantiate(tcx, impl_substs).predicates,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_middle::ty::subst::{Subst, SubstsRef};
|
use rustc_middle::ty::subst::{Subst, SubstsRef};
|
||||||
use rustc_middle::ty::{self, EarlyBinder, GenericParamDefKind};
|
use rustc_middle::ty::{self, GenericParamDefKind};
|
||||||
use rustc_span::symbol::sym;
|
use rustc_span::symbol::sym;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
|
|
||||||
@ -45,8 +45,7 @@ fn impl_similar_to(
|
|||||||
|
|
||||||
self.tcx.for_each_relevant_impl(trait_ref.def_id, trait_self_ty, |def_id| {
|
self.tcx.for_each_relevant_impl(trait_ref.def_id, trait_self_ty, |def_id| {
|
||||||
let impl_substs = self.fresh_substs_for_item(obligation.cause.span, def_id);
|
let impl_substs = self.fresh_substs_for_item(obligation.cause.span, def_id);
|
||||||
let impl_trait_ref =
|
let impl_trait_ref = tcx.bound_impl_trait_ref(def_id).unwrap().subst(tcx, impl_substs);
|
||||||
EarlyBinder(tcx.impl_trait_ref(def_id).unwrap()).subst(tcx, impl_substs);
|
|
||||||
|
|
||||||
let impl_self_ty = impl_trait_ref.self_ty();
|
let impl_self_ty = impl_trait_ref.self_ty();
|
||||||
|
|
||||||
|
@ -2066,12 +2066,12 @@ fn match_impl(
|
|||||||
impl_def_id: DefId,
|
impl_def_id: DefId,
|
||||||
obligation: &TraitObligation<'tcx>,
|
obligation: &TraitObligation<'tcx>,
|
||||||
) -> Result<Normalized<'tcx, SubstsRef<'tcx>>, ()> {
|
) -> Result<Normalized<'tcx, SubstsRef<'tcx>>, ()> {
|
||||||
let impl_trait_ref = self.tcx().impl_trait_ref(impl_def_id).unwrap();
|
let impl_trait_ref = self.tcx().bound_impl_trait_ref(impl_def_id).unwrap();
|
||||||
|
|
||||||
// Before we create the substitutions and everything, first
|
// Before we create the substitutions and everything, first
|
||||||
// consider a "quick reject". This avoids creating more types
|
// consider a "quick reject". This avoids creating more types
|
||||||
// and so forth that we need to.
|
// and so forth that we need to.
|
||||||
if self.fast_reject_trait_refs(obligation, &impl_trait_ref) {
|
if self.fast_reject_trait_refs(obligation, &impl_trait_ref.0) {
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2081,7 +2081,7 @@ fn match_impl(
|
|||||||
|
|
||||||
let impl_substs = self.infcx.fresh_substs_for_item(obligation.cause.span, impl_def_id);
|
let impl_substs = self.infcx.fresh_substs_for_item(obligation.cause.span, impl_def_id);
|
||||||
|
|
||||||
let impl_trait_ref = EarlyBinder(impl_trait_ref).subst(self.tcx(), impl_substs);
|
let impl_trait_ref = impl_trait_ref.subst(self.tcx(), impl_substs);
|
||||||
|
|
||||||
debug!(?impl_trait_ref);
|
debug!(?impl_trait_ref);
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_middle::lint::LintDiagnosticBuilder;
|
use rustc_middle::lint::LintDiagnosticBuilder;
|
||||||
use rustc_middle::ty::subst::{InternalSubsts, Subst, SubstsRef};
|
use rustc_middle::ty::subst::{InternalSubsts, Subst, SubstsRef};
|
||||||
use rustc_middle::ty::{self, EarlyBinder, ImplSubject, TyCtxt};
|
use rustc_middle::ty::{self, ImplSubject, TyCtxt};
|
||||||
use rustc_session::lint::builtin::COHERENCE_LEAK_CHECK;
|
use rustc_session::lint::builtin::COHERENCE_LEAK_CHECK;
|
||||||
use rustc_session::lint::builtin::ORDER_DEPENDENT_TRAIT_OBJECTS;
|
use rustc_session::lint::builtin::ORDER_DEPENDENT_TRAIT_OBJECTS;
|
||||||
use rustc_span::{Span, DUMMY_SP};
|
use rustc_span::{Span, DUMMY_SP};
|
||||||
@ -84,8 +84,8 @@ pub fn translate_substs<'a, 'tcx>(
|
|||||||
"translate_substs({:?}, {:?}, {:?}, {:?})",
|
"translate_substs({:?}, {:?}, {:?}, {:?})",
|
||||||
param_env, source_impl, source_substs, target_node
|
param_env, source_impl, source_substs, target_node
|
||||||
);
|
);
|
||||||
let source_trait_ref = EarlyBinder(infcx.tcx.impl_trait_ref(source_impl).unwrap())
|
let source_trait_ref =
|
||||||
.subst(infcx.tcx, &source_substs);
|
infcx.tcx.bound_impl_trait_ref(source_impl).unwrap().subst(infcx.tcx, &source_substs);
|
||||||
|
|
||||||
// translate the Self and Param parts of the substitution, since those
|
// translate the Self and Param parts of the substitution, since those
|
||||||
// vary across impls
|
// vary across impls
|
||||||
|
@ -310,8 +310,8 @@ fn impl_datum(
|
|||||||
let bound_vars = bound_vars_for_item(self.interner.tcx, def_id);
|
let bound_vars = bound_vars_for_item(self.interner.tcx, def_id);
|
||||||
let binders = binders_for(self.interner, bound_vars);
|
let binders = binders_for(self.interner, bound_vars);
|
||||||
|
|
||||||
let trait_ref = self.interner.tcx.impl_trait_ref(def_id).expect("not an impl");
|
let trait_ref = self.interner.tcx.bound_impl_trait_ref(def_id).expect("not an impl");
|
||||||
let trait_ref = EarlyBinder(trait_ref).subst(self.interner.tcx, bound_vars);
|
let trait_ref = trait_ref.subst(self.interner.tcx, bound_vars);
|
||||||
|
|
||||||
let where_clauses = self.where_clauses_for(def_id, bound_vars);
|
let where_clauses = self.where_clauses_for(def_id, bound_vars);
|
||||||
|
|
||||||
@ -352,11 +352,11 @@ fn impls_for_trait(
|
|||||||
let all_impls = self.interner.tcx.all_impls(def_id);
|
let all_impls = self.interner.tcx.all_impls(def_id);
|
||||||
let matched_impls = all_impls.filter(|impl_def_id| {
|
let matched_impls = all_impls.filter(|impl_def_id| {
|
||||||
use chalk_ir::could_match::CouldMatch;
|
use chalk_ir::could_match::CouldMatch;
|
||||||
let trait_ref = self.interner.tcx.impl_trait_ref(*impl_def_id).unwrap();
|
let trait_ref = self.interner.tcx.bound_impl_trait_ref(*impl_def_id).unwrap();
|
||||||
let bound_vars = bound_vars_for_item(self.interner.tcx, *impl_def_id);
|
let bound_vars = bound_vars_for_item(self.interner.tcx, *impl_def_id);
|
||||||
|
|
||||||
let self_ty = trait_ref.self_ty();
|
let self_ty = trait_ref.map_bound(|t| t.self_ty());
|
||||||
let self_ty = EarlyBinder(self_ty).subst(self.interner.tcx, bound_vars);
|
let self_ty = self_ty.subst(self.interner.tcx, bound_vars);
|
||||||
let lowered_ty = self_ty.lower_into(self.interner);
|
let lowered_ty = self_ty.lower_into(self.interner);
|
||||||
|
|
||||||
parameters[0].assert_ty_ref(self.interner).could_match(
|
parameters[0].assert_ty_ref(self.interner).could_match(
|
||||||
|
@ -34,15 +34,15 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
|
|||||||
trait_def_id,
|
trait_def_id,
|
||||||
impl_def_id
|
impl_def_id
|
||||||
);
|
);
|
||||||
let trait_ref = cx.tcx.impl_trait_ref(impl_def_id).unwrap();
|
let trait_ref = cx.tcx.bound_impl_trait_ref(impl_def_id).unwrap();
|
||||||
let is_param = matches!(trait_ref.self_ty().kind(), ty::Param(_));
|
let is_param = matches!(trait_ref.0.self_ty().kind(), ty::Param(_));
|
||||||
let may_apply = is_param && cx.tcx.infer_ctxt().enter(|infcx| {
|
let may_apply = is_param && cx.tcx.infer_ctxt().enter(|infcx| {
|
||||||
let substs = infcx.fresh_substs_for_item(DUMMY_SP, item_def_id);
|
let substs = infcx.fresh_substs_for_item(DUMMY_SP, item_def_id);
|
||||||
let ty = ty.subst(infcx.tcx, substs);
|
let ty = ty.subst(infcx.tcx, substs);
|
||||||
let param_env = EarlyBinder(param_env).subst(infcx.tcx, substs);
|
let param_env = EarlyBinder(param_env).subst(infcx.tcx, substs);
|
||||||
|
|
||||||
let impl_substs = infcx.fresh_substs_for_item(DUMMY_SP, impl_def_id);
|
let impl_substs = infcx.fresh_substs_for_item(DUMMY_SP, impl_def_id);
|
||||||
let trait_ref = EarlyBinder(trait_ref).subst(infcx.tcx, impl_substs);
|
let trait_ref = trait_ref.subst(infcx.tcx, impl_substs);
|
||||||
|
|
||||||
// Require the type the impl is implemented on to match
|
// Require the type the impl is implemented on to match
|
||||||
// our type, and ignore the impl if there was a mismatch.
|
// our type, and ignore the impl if there was a mismatch.
|
||||||
@ -115,7 +115,7 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
|
|||||||
),
|
),
|
||||||
// FIXME(eddyb) compute both `trait_` and `for_` from
|
// FIXME(eddyb) compute both `trait_` and `for_` from
|
||||||
// the post-inference `trait_ref`, as it's more accurate.
|
// the post-inference `trait_ref`, as it's more accurate.
|
||||||
trait_: Some(trait_ref.clean(cx)),
|
trait_: Some(trait_ref.0.clean(cx)),
|
||||||
for_: ty.0.clean(cx),
|
for_: ty.0.clean(cx),
|
||||||
items: cx.tcx
|
items: cx.tcx
|
||||||
.associated_items(impl_def_id)
|
.associated_items(impl_def_id)
|
||||||
@ -123,7 +123,7 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
|
|||||||
.map(|x| x.clean(cx))
|
.map(|x| x.clean(cx))
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
polarity: ty::ImplPolarity::Positive,
|
polarity: ty::ImplPolarity::Positive,
|
||||||
kind: ImplKind::Blanket(box trait_ref.self_ty().clean(cx)),
|
kind: ImplKind::Blanket(box trait_ref.0.self_ty().clean(cx)),
|
||||||
}),
|
}),
|
||||||
cfg: None,
|
cfg: None,
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user