Remove DefId from AssocItemContainer.
This commit is contained in:
parent
8ee4446ee5
commit
d7ea161b7e
40 changed files with 190 additions and 220 deletions
|
@ -255,7 +255,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
trait_bound_spans.push(*span);
|
||||
}
|
||||
for assoc_item in items {
|
||||
let trait_def_id = assoc_item.container.id();
|
||||
let trait_def_id = assoc_item.container_id(tcx);
|
||||
names.push(format!(
|
||||
"`{}` (from trait `{}`)",
|
||||
assoc_item.name,
|
||||
|
@ -321,7 +321,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
let mut dupes = false;
|
||||
for item in assoc_items {
|
||||
let prefix = if names[&item.name] > 1 {
|
||||
let trait_def_id = item.container.id();
|
||||
let trait_def_id = item.container_id(tcx);
|
||||
dupes = true;
|
||||
format!("{}::", tcx.def_path_str(trait_def_id))
|
||||
} else {
|
||||
|
@ -376,7 +376,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
let mut label = vec![];
|
||||
for item in assoc_items {
|
||||
let postfix = if names[&item.name] > 1 {
|
||||
let trait_def_id = item.container.id();
|
||||
let trait_def_id = item.container_id(tcx);
|
||||
format!(" (from trait `{}`)", tcx.def_path_str(trait_def_id))
|
||||
} else {
|
||||
String::new()
|
||||
|
|
|
@ -1160,7 +1160,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
span: binding.span,
|
||||
prev_span: *prev_span,
|
||||
item_name: binding.item_name,
|
||||
def_path: tcx.def_path_str(assoc_item.container.id()),
|
||||
def_path: tcx.def_path_str(assoc_item.container_id(tcx)),
|
||||
});
|
||||
})
|
||||
.or_insert(binding.span);
|
||||
|
|
|
@ -165,7 +165,7 @@ fn compare_predicate_entailment<'tcx>(
|
|||
|
||||
// Create mapping from trait to placeholder.
|
||||
let trait_to_placeholder_substs =
|
||||
impl_to_placeholder_substs.rebase_onto(tcx, impl_m.container.id(), trait_to_impl_substs);
|
||||
impl_to_placeholder_substs.rebase_onto(tcx, impl_m.container_id(tcx), trait_to_impl_substs);
|
||||
debug!("compare_impl_method: trait_to_placeholder_substs={:?}", trait_to_placeholder_substs);
|
||||
|
||||
let impl_m_generics = tcx.generics_of(impl_m.def_id);
|
||||
|
@ -511,8 +511,8 @@ fn compare_self_type<'tcx>(
|
|||
|
||||
let self_string = |method: &ty::AssocItem| {
|
||||
let untransformed_self_ty = match method.container {
|
||||
ty::ImplContainer(_) => impl_trait_ref.self_ty(),
|
||||
ty::TraitContainer(_) => tcx.types.self_param,
|
||||
ty::ImplContainer => impl_trait_ref.self_ty(),
|
||||
ty::TraitContainer => tcx.types.self_param,
|
||||
};
|
||||
let self_arg_ty = tcx.fn_sig(method.def_id).input(0);
|
||||
let param_env = ty::ParamEnv::reveal_all();
|
||||
|
@ -1194,7 +1194,7 @@ fn compare_type_predicate_entailment<'tcx>(
|
|||
) -> Result<(), ErrorGuaranteed> {
|
||||
let impl_substs = InternalSubsts::identity_for_item(tcx, impl_ty.def_id);
|
||||
let trait_to_impl_substs =
|
||||
impl_substs.rebase_onto(tcx, impl_ty.container.id(), impl_trait_ref.substs);
|
||||
impl_substs.rebase_onto(tcx, impl_ty.container_id(tcx), impl_trait_ref.substs);
|
||||
|
||||
let impl_ty_generics = tcx.generics_of(impl_ty.def_id);
|
||||
let trait_ty_generics = tcx.generics_of(trait_ty.def_id);
|
||||
|
@ -1390,9 +1390,9 @@ pub fn check_type_bounds<'tcx>(
|
|||
});
|
||||
let bound_vars = tcx.mk_bound_variable_kinds(bound_vars.into_iter());
|
||||
let impl_ty_substs = tcx.intern_substs(&substs);
|
||||
let container_id = impl_ty.container_id(tcx);
|
||||
|
||||
let rebased_substs =
|
||||
impl_ty_substs.rebase_onto(tcx, impl_ty.container.id(), impl_trait_ref.substs);
|
||||
let rebased_substs = impl_ty_substs.rebase_onto(tcx, container_id, impl_trait_ref.substs);
|
||||
let impl_ty_value = tcx.type_of(impl_ty.def_id);
|
||||
|
||||
let param_env = tcx.param_env(impl_ty.def_id);
|
||||
|
@ -1441,8 +1441,7 @@ pub fn check_type_bounds<'tcx>(
|
|||
debug!(?normalize_param_env);
|
||||
|
||||
let impl_ty_substs = InternalSubsts::identity_for_item(tcx, impl_ty.def_id);
|
||||
let rebased_substs =
|
||||
impl_ty_substs.rebase_onto(tcx, impl_ty.container.id(), impl_trait_ref.substs);
|
||||
let rebased_substs = impl_ty_substs.rebase_onto(tcx, container_id, impl_trait_ref.substs);
|
||||
|
||||
tcx.infer_ctxt().enter(move |infcx| {
|
||||
let ocx = ObligationCtxt::new(&infcx);
|
||||
|
@ -1505,10 +1504,13 @@ pub fn check_type_bounds<'tcx>(
|
|||
// Finally, resolve all regions. This catches wily misuses of
|
||||
// lifetime parameters.
|
||||
let implied_bounds = match impl_ty.container {
|
||||
ty::TraitContainer(_) => FxHashSet::default(),
|
||||
ty::ImplContainer(def_id) => {
|
||||
wfcheck::impl_implied_bounds(tcx, param_env, def_id.expect_local(), impl_ty_span)
|
||||
}
|
||||
ty::TraitContainer => FxHashSet::default(),
|
||||
ty::ImplContainer => wfcheck::impl_implied_bounds(
|
||||
tcx,
|
||||
param_env,
|
||||
container_id.expect_local(),
|
||||
impl_ty_span,
|
||||
),
|
||||
};
|
||||
let mut outlives_environment = OutlivesEnvironment::new(param_env);
|
||||
outlives_environment.add_implied_bounds(&infcx, implied_bounds, impl_ty_hir_id);
|
||||
|
|
|
@ -775,7 +775,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
self.typeck_results.borrow().type_dependent_def_id(expr.hir_id).map(
|
||||
|did| {
|
||||
let ai = self.tcx.associated_item(did);
|
||||
ai.container == ty::TraitContainer(clone_trait)
|
||||
ai.trait_container(self.tcx) == Some(clone_trait)
|
||||
},
|
||||
),
|
||||
segment.ident.name,
|
||||
|
|
|
@ -1090,13 +1090,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
is_alias_variant_ctor = true;
|
||||
}
|
||||
Res::Def(DefKind::AssocFn | DefKind::AssocConst, def_id) => {
|
||||
let container = tcx.associated_item(def_id).container;
|
||||
debug!(?def_id, ?container);
|
||||
let assoc_item = tcx.associated_item(def_id);
|
||||
let container = assoc_item.container;
|
||||
let container_id = assoc_item.container_id(tcx);
|
||||
debug!(?def_id, ?container, ?container_id);
|
||||
match container {
|
||||
ty::TraitContainer(trait_did) => {
|
||||
callee::check_legal_trait_for_method_call(tcx, span, None, span, trait_did)
|
||||
ty::TraitContainer => {
|
||||
callee::check_legal_trait_for_method_call(tcx, span, None, span, container_id)
|
||||
}
|
||||
ty::ImplContainer(impl_def_id) => {
|
||||
ty::ImplContainer => {
|
||||
if segments.len() == 1 {
|
||||
// `<T>::assoc` will end up here, and so
|
||||
// can `T::assoc`. It this came from an
|
||||
|
@ -1104,7 +1106,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// `T` for posterity (see `UserSelfTy` for
|
||||
// details).
|
||||
let self_ty = self_ty.expect("UFCS sugared assoc missing Self");
|
||||
user_self_ty = Some(UserSelfTy { impl_def_id, self_ty });
|
||||
user_self_ty = Some(UserSelfTy { impl_def_id: container_id, self_ty });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -839,8 +839,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
&& results.type_dependent_def_id(expr.hir_id).map_or(
|
||||
false,
|
||||
|did| {
|
||||
self.tcx.associated_item(did).container
|
||||
== ty::AssocItemContainer::TraitContainer(clone_trait_did)
|
||||
let assoc_item = self.tcx.associated_item(did);
|
||||
assoc_item.container == ty::AssocItemContainer::TraitContainer
|
||||
&& assoc_item.container_id(self.tcx) == clone_trait_did
|
||||
},
|
||||
)
|
||||
// If that clone call hasn't already dereferenced the self type (i.e. don't give this
|
||||
|
|
|
@ -238,7 +238,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
|||
) -> SubstsRef<'tcx> {
|
||||
match pick.kind {
|
||||
probe::InherentImplPick => {
|
||||
let impl_def_id = pick.item.container.id();
|
||||
let impl_def_id = pick.item.container_id(self.tcx);
|
||||
assert!(
|
||||
self.tcx.impl_trait_ref(impl_def_id).is_none(),
|
||||
"impl {:?} is not an inherent impl",
|
||||
|
@ -248,7 +248,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
|||
}
|
||||
|
||||
probe::ObjectPick => {
|
||||
let trait_def_id = pick.item.container.id();
|
||||
let trait_def_id = pick.item.container_id(self.tcx);
|
||||
self.extract_existential_trait_ref(self_ty, |this, object_ty, principal| {
|
||||
// The object data has no entry for the Self
|
||||
// Type. For the purposes of this method call, we
|
||||
|
@ -273,7 +273,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
|||
}
|
||||
|
||||
probe::TraitPick => {
|
||||
let trait_def_id = pick.item.container.id();
|
||||
let trait_def_id = pick.item.container_id(self.tcx);
|
||||
|
||||
// Make a trait reference `$0 : Trait<$1...$n>`
|
||||
// consisting entirely of type variables. Later on in
|
||||
|
@ -540,15 +540,14 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
|||
|
||||
fn enforce_illegal_method_limitations(&self, pick: &probe::Pick<'_>) {
|
||||
// Disallow calls to the method `drop` defined in the `Drop` trait.
|
||||
match pick.item.container {
|
||||
ty::TraitContainer(trait_def_id) => callee::check_legal_trait_for_method_call(
|
||||
if let Some(trait_def_id) = pick.item.trait_container(self.tcx) {
|
||||
callee::check_legal_trait_for_method_call(
|
||||
self.tcx,
|
||||
self.span,
|
||||
Some(self.self_expr.span),
|
||||
self.call_expr.span,
|
||||
trait_def_id,
|
||||
),
|
||||
ty::ImplContainer(..) => {}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -231,7 +231,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
ProbeScope::AllTraits,
|
||||
) {
|
||||
// If we find a different result the caller probably forgot to import a trait.
|
||||
Ok(ref new_pick) if *new_pick != pick => vec![new_pick.item.container.id()],
|
||||
Ok(ref new_pick) if *new_pick != pick => vec![new_pick.item.container_id(self.tcx)],
|
||||
Err(Ambiguity(ref sources)) => sources
|
||||
.iter()
|
||||
.filter_map(|source| {
|
||||
|
|
|
@ -148,7 +148,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
let trait_name = self.trait_path_or_bare_name(
|
||||
span,
|
||||
call_expr.hir_id,
|
||||
pick.item.container.id(),
|
||||
pick.item.container_id(self.tcx),
|
||||
);
|
||||
|
||||
let mut lint = lint.build(&format!(
|
||||
|
@ -261,8 +261,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
self.tcx.struct_span_lint_hir(RUST_2021_PRELUDE_COLLISIONS, expr_id, span, |lint| {
|
||||
// "type" refers to either a type or, more likely, a trait from which
|
||||
// the associated function or method is from.
|
||||
let trait_path = self.trait_path_or_bare_name(span, expr_id, pick.item.container.id());
|
||||
let trait_generics = self.tcx.generics_of(pick.item.container.id());
|
||||
let container_id = pick.item.container_id(self.tcx);
|
||||
let trait_path = self.trait_path_or_bare_name(span, expr_id, container_id);
|
||||
let trait_generics = self.tcx.generics_of(container_id);
|
||||
|
||||
let trait_name =
|
||||
if trait_generics.params.len() <= trait_generics.has_self as usize {
|
||||
|
|
|
@ -592,8 +592,10 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
|||
fn push_candidate(&mut self, candidate: Candidate<'tcx>, is_inherent: bool) {
|
||||
let is_accessible = if let Some(name) = self.method_name {
|
||||
let item = candidate.item;
|
||||
let def_scope =
|
||||
self.tcx.adjust_ident_and_get_scope(name, item.container.id(), self.body_id).1;
|
||||
let def_scope = self
|
||||
.tcx
|
||||
.adjust_ident_and_get_scope(name, item.container_id(self.tcx), self.body_id)
|
||||
.1;
|
||||
item.visibility(self.tcx).is_accessible_from(def_scope, self.tcx)
|
||||
} else {
|
||||
true
|
||||
|
@ -1025,7 +1027,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
|||
self.assemble_extension_candidates_for_all_traits();
|
||||
|
||||
let out_of_scope_traits = match self.pick_core() {
|
||||
Some(Ok(p)) => vec![p.item.container.id()],
|
||||
Some(Ok(p)) => vec![p.item.container_id(self.tcx)],
|
||||
//Some(Ok(p)) => p.iter().map(|p| p.item.container().id()).collect(),
|
||||
Some(Err(MethodError::Ambiguity(v))) => v
|
||||
.into_iter()
|
||||
|
@ -1387,7 +1389,8 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
|||
self.tcx.def_path_str(stable_pick.item.def_id),
|
||||
));
|
||||
}
|
||||
(ty::AssocKind::Const, ty::AssocItemContainer::TraitContainer(def_id)) => {
|
||||
(ty::AssocKind::Const, ty::AssocItemContainer::TraitContainer) => {
|
||||
let def_id = stable_pick.item.container_id(self.tcx);
|
||||
diag.span_suggestion(
|
||||
self.span,
|
||||
"use the fully qualified path to the associated const",
|
||||
|
@ -1429,9 +1432,11 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
|||
|
||||
fn candidate_source(&self, candidate: &Candidate<'tcx>, self_ty: Ty<'tcx>) -> CandidateSource {
|
||||
match candidate.kind {
|
||||
InherentImplCandidate(..) => CandidateSource::Impl(candidate.item.container.id()),
|
||||
InherentImplCandidate(..) => {
|
||||
CandidateSource::Impl(candidate.item.container_id(self.tcx))
|
||||
}
|
||||
ObjectCandidate | WhereClauseCandidate(_) => {
|
||||
CandidateSource::Trait(candidate.item.container.id())
|
||||
CandidateSource::Trait(candidate.item.container_id(self.tcx))
|
||||
}
|
||||
TraitCandidate(trait_ref) => self.probe(|_| {
|
||||
let _ = self
|
||||
|
@ -1444,7 +1449,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
|||
// to that impl.
|
||||
CandidateSource::Impl(impl_data.impl_def_id)
|
||||
}
|
||||
_ => CandidateSource::Trait(candidate.item.container.id()),
|
||||
_ => CandidateSource::Trait(candidate.item.container_id(self.tcx)),
|
||||
}
|
||||
}),
|
||||
}
|
||||
|
@ -1502,7 +1507,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
|||
debug!("xform_ret_ty after normalization: {:?}", xform_ret_ty);
|
||||
|
||||
// Check whether the impl imposes obligations we have to worry about.
|
||||
let impl_def_id = probe.item.container.id();
|
||||
let impl_def_id = probe.item.container_id(self.tcx);
|
||||
let impl_bounds = self.tcx.predicates_of(impl_def_id);
|
||||
let impl_bounds = impl_bounds.instantiate(self.tcx, substs);
|
||||
let traits::Normalized { value: impl_bounds, obligations: norm_obligations } =
|
||||
|
@ -1653,12 +1658,12 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
|||
probes: &[(&Candidate<'tcx>, ProbeResult)],
|
||||
) -> Option<Pick<'tcx>> {
|
||||
// Do all probes correspond to the same trait?
|
||||
let container = probes[0].0.item.container;
|
||||
if let ty::ImplContainer(_) = container {
|
||||
return None;
|
||||
}
|
||||
if probes[1..].iter().any(|&(p, _)| p.item.container != container) {
|
||||
return None;
|
||||
let container = probes[0].0.item.trait_container(self.tcx)?;
|
||||
for (p, _) in &probes[1..] {
|
||||
let p_container = p.item.trait_container(self.tcx)?;
|
||||
if p_container != container {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: check the return type here somehow.
|
||||
|
|
|
@ -1789,7 +1789,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// We point at the method, but we just skip the rest of the check for arbitrary
|
||||
// self types and rely on the suggestion to `use` the trait from
|
||||
// `suggest_valid_traits`.
|
||||
let did = Some(pick.item.container.id());
|
||||
let did = Some(pick.item.container_id(self.tcx));
|
||||
let skip = skippable.contains(&did);
|
||||
if pick.autoderefs == 0 && !skip {
|
||||
err.span_label(
|
||||
|
@ -1825,7 +1825,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
)
|
||||
{
|
||||
debug!("try_alt_rcvr: pick candidate {:?}", pick);
|
||||
let did = Some(pick.item.container.id());
|
||||
let did = Some(pick.item.container_id(self.tcx));
|
||||
// We don't want to suggest a container type when the missing
|
||||
// method is `.clone()` or `.deref()` otherwise we'd suggest
|
||||
// `Arc::new(foo).clone()`, which is far from what the user wants.
|
||||
|
|
|
@ -977,11 +977,14 @@ fn check_associated_item(
|
|||
let item = tcx.associated_item(item_id);
|
||||
|
||||
let (mut implied_bounds, self_ty) = match item.container {
|
||||
ty::TraitContainer(_) => (FxHashSet::default(), tcx.types.self_param),
|
||||
ty::ImplContainer(def_id) => (
|
||||
impl_implied_bounds(tcx, wfcx.param_env, def_id.expect_local(), span),
|
||||
tcx.type_of(def_id),
|
||||
),
|
||||
ty::TraitContainer => (FxHashSet::default(), tcx.types.self_param),
|
||||
ty::ImplContainer => {
|
||||
let def_id = item.container_id(tcx);
|
||||
(
|
||||
impl_implied_bounds(tcx, wfcx.param_env, def_id.expect_local(), span),
|
||||
tcx.type_of(def_id),
|
||||
)
|
||||
}
|
||||
};
|
||||
|
||||
match item.kind {
|
||||
|
@ -1004,7 +1007,7 @@ fn check_associated_item(
|
|||
check_method_receiver(wfcx, hir_sig, item, self_ty);
|
||||
}
|
||||
ty::AssocKind::Type => {
|
||||
if let ty::AssocItemContainer::TraitContainer(_) = item.container {
|
||||
if let ty::AssocItemContainer::TraitContainer = item.container {
|
||||
check_associated_type_bounds(wfcx, item, span)
|
||||
}
|
||||
if item.defaultness(tcx).has_value() {
|
||||
|
|
|
@ -2433,7 +2433,7 @@ fn explicit_predicates_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> ty::Generic
|
|||
// supertrait).
|
||||
if let ty::Projection(projection) = ty.kind() {
|
||||
projection.substs == trait_identity_substs
|
||||
&& tcx.associated_item(projection.item_def_id).container.id() == def_id
|
||||
&& tcx.associated_item(projection.item_def_id).container_id(tcx) == def_id
|
||||
} else {
|
||||
false
|
||||
}
|
||||
|
@ -3264,7 +3264,7 @@ fn asm_target_features<'tcx>(tcx: TyCtxt<'tcx>, did: DefId) -> &'tcx FxHashSet<S
|
|||
/// applied to the method prototype.
|
||||
fn should_inherit_track_caller(tcx: TyCtxt<'_>, def_id: DefId) -> bool {
|
||||
if let Some(impl_item) = tcx.opt_associated_item(def_id)
|
||||
&& let ty::AssocItemContainer::ImplContainer(_) = impl_item.container
|
||||
&& let ty::AssocItemContainer::ImplContainer = impl_item.container
|
||||
&& let Some(trait_item) = impl_item.trait_item_def_id
|
||||
{
|
||||
return tcx
|
||||
|
|
|
@ -3,7 +3,7 @@ use crate::astconv::AstConv;
|
|||
use rustc_hir as hir;
|
||||
use rustc_infer::traits::util;
|
||||
use rustc_middle::ty::subst::InternalSubsts;
|
||||
use rustc_middle::ty::{self, TyCtxt};
|
||||
use rustc_middle::ty::{self, DefIdTree, TyCtxt};
|
||||
use rustc_span::def_id::DefId;
|
||||
use rustc_span::Span;
|
||||
|
||||
|
@ -30,7 +30,7 @@ fn associated_type_bounds<'tcx>(
|
|||
// Associated types are implicitly sized unless a `?Sized` bound is found
|
||||
<dyn AstConv<'_>>::add_implicitly_sized(&icx, &mut bounds, ast_bounds, None, span);
|
||||
|
||||
let trait_def_id = tcx.associated_item(assoc_item_def_id).container.id();
|
||||
let trait_def_id = tcx.parent(assoc_item_def_id);
|
||||
let trait_predicates = tcx.trait_explicit_predicates_and_bounds(trait_def_id.expect_local());
|
||||
|
||||
let bounds_from_parent = trait_predicates.predicates.iter().copied().filter(|(pred, _)| {
|
||||
|
|
|
@ -2,7 +2,7 @@ use rustc_data_structures::fx::FxHashMap;
|
|||
use rustc_hir::def::DefKind;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_middle::ty::subst::{GenericArg, GenericArgKind, Subst};
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||
use rustc_middle::ty::{self, DefIdTree, Ty, TyCtxt};
|
||||
use rustc_span::Span;
|
||||
|
||||
use super::explicit::ExplicitPredicatesMap;
|
||||
|
@ -202,7 +202,7 @@ fn insert_required_predicates_to_be_wf<'tcx>(
|
|||
debug!("Projection");
|
||||
check_explicit_predicates(
|
||||
tcx,
|
||||
tcx.associated_item(obj.item_def_id).container.id(),
|
||||
tcx.parent(obj.item_def_id),
|
||||
obj.substs,
|
||||
required_predicates,
|
||||
explicit_map,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue