Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 47a6191

Browse files
committed
Arbitrary self types v2: store receiver step count.
A subsequent commit will involve working out which methods actually shadow other methods, and one of the rules will be to compare the depth via a chain of Receiver traits of the shadowing and shaodwed methods. This commit records this information; currently unused.
1 parent aeb1c47 commit 47a6191

File tree

1 file changed

+66
-18
lines changed
  • compiler/rustc_hir_typeck/src/method

1 file changed

+66
-18
lines changed

compiler/rustc_hir_typeck/src/method/probe.rs

Lines changed: 66 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ pub(crate) struct Candidate<'tcx> {
104104
pub(crate) item: ty::AssocItem,
105105
pub(crate) kind: CandidateKind<'tcx>,
106106
pub(crate) import_ids: SmallVec<[LocalDefId; 1]>,
107+
receiver_trait_derefs: usize,
107108
}
108109

109110
#[derive(Debug, Clone)]
@@ -176,6 +177,11 @@ pub struct Pick<'tcx> {
176177

177178
/// Unstable candidates alongside the stable ones.
178179
unstable_candidates: Vec<(Candidate<'tcx>, Symbol)>,
180+
181+
/// Number of jumps along the Receiver::target chain we followed
182+
/// to identify this method. Used only for deshadowing errors.
183+
#[allow(dead_code)]
184+
pub receiver_trait_derefs: usize,
179185
}
180186

181187
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -497,6 +503,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
497503
item,
498504
kind: CandidateKind::TraitCandidate(ty::Binder::dummy(trait_ref)),
499505
import_ids: smallvec![],
506+
receiver_trait_derefs: 0usize,
500507
},
501508
false,
502509
);
@@ -646,12 +653,16 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
646653

647654
fn assemble_inherent_candidates(&mut self) {
648655
for step in self.steps.iter() {
649-
self.assemble_probe(&step.self_ty);
656+
self.assemble_probe(&step.self_ty, step.autoderefs);
650657
}
651658
}
652659

653660
#[instrument(level = "debug", skip(self))]
654-
fn assemble_probe(&mut self, self_ty: &Canonical<'tcx, QueryResponse<'tcx, Ty<'tcx>>>) {
661+
fn assemble_probe(
662+
&mut self,
663+
self_ty: &Canonical<'tcx, QueryResponse<'tcx, Ty<'tcx>>>,
664+
receiver_trait_derefs: usize,
665+
) {
655666
let raw_self_ty = self_ty.value.value;
656667
match *raw_self_ty.kind() {
657668
ty::Dynamic(data, ..) if let Some(p) = data.principal() => {
@@ -675,27 +686,39 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
675686
let (QueryResponse { value: generalized_self_ty, .. }, _ignored_var_values) =
676687
self.fcx.instantiate_canonical(self.span, self_ty);
677688

678-
self.assemble_inherent_candidates_from_object(generalized_self_ty);
679-
self.assemble_inherent_impl_candidates_for_type(p.def_id());
689+
self.assemble_inherent_candidates_from_object(
690+
generalized_self_ty,
691+
receiver_trait_derefs,
692+
);
693+
self.assemble_inherent_impl_candidates_for_type(p.def_id(), receiver_trait_derefs);
680694
if self.tcx.has_attr(p.def_id(), sym::rustc_has_incoherent_inherent_impls) {
681-
self.assemble_inherent_candidates_for_incoherent_ty(raw_self_ty);
695+
self.assemble_inherent_candidates_for_incoherent_ty(
696+
raw_self_ty,
697+
receiver_trait_derefs,
698+
);
682699
}
683700
}
684701
ty::Adt(def, _) => {
685702
let def_id = def.did();
686-
self.assemble_inherent_impl_candidates_for_type(def_id);
703+
self.assemble_inherent_impl_candidates_for_type(def_id, receiver_trait_derefs);
687704
if self.tcx.has_attr(def_id, sym::rustc_has_incoherent_inherent_impls) {
688-
self.assemble_inherent_candidates_for_incoherent_ty(raw_self_ty);
705+
self.assemble_inherent_candidates_for_incoherent_ty(
706+
raw_self_ty,
707+
receiver_trait_derefs,
708+
);
689709
}
690710
}
691711
ty::Foreign(did) => {
692-
self.assemble_inherent_impl_candidates_for_type(did);
712+
self.assemble_inherent_impl_candidates_for_type(did, receiver_trait_derefs);
693713
if self.tcx.has_attr(did, sym::rustc_has_incoherent_inherent_impls) {
694-
self.assemble_inherent_candidates_for_incoherent_ty(raw_self_ty);
714+
self.assemble_inherent_candidates_for_incoherent_ty(
715+
raw_self_ty,
716+
receiver_trait_derefs,
717+
);
695718
}
696719
}
697720
ty::Param(p) => {
698-
self.assemble_inherent_candidates_from_param(p);
721+
self.assemble_inherent_candidates_from_param(p, receiver_trait_derefs);
699722
}
700723
ty::Bool
701724
| ty::Char
@@ -708,29 +731,38 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
708731
| ty::RawPtr(_, _)
709732
| ty::Ref(..)
710733
| ty::Never
711-
| ty::Tuple(..) => self.assemble_inherent_candidates_for_incoherent_ty(raw_self_ty),
734+
| ty::Tuple(..) => self
735+
.assemble_inherent_candidates_for_incoherent_ty(raw_self_ty, receiver_trait_derefs),
712736
_ => {}
713737
}
714738
}
715739

716-
fn assemble_inherent_candidates_for_incoherent_ty(&mut self, self_ty: Ty<'tcx>) {
740+
fn assemble_inherent_candidates_for_incoherent_ty(
741+
&mut self,
742+
self_ty: Ty<'tcx>,
743+
receiver_trait_derefs: usize,
744+
) {
717745
let Some(simp) = simplify_type(self.tcx, self_ty, TreatParams::AsCandidateKey) else {
718746
bug!("unexpected incoherent type: {:?}", self_ty)
719747
};
720748
for &impl_def_id in self.tcx.incoherent_impls(simp).into_iter().flatten() {
721-
self.assemble_inherent_impl_probe(impl_def_id);
749+
self.assemble_inherent_impl_probe(impl_def_id, receiver_trait_derefs);
722750
}
723751
}
724752

725-
fn assemble_inherent_impl_candidates_for_type(&mut self, def_id: DefId) {
753+
fn assemble_inherent_impl_candidates_for_type(
754+
&mut self,
755+
def_id: DefId,
756+
receiver_trait_derefs: usize,
757+
) {
726758
let impl_def_ids = self.tcx.at(self.span).inherent_impls(def_id).into_iter().flatten();
727759
for &impl_def_id in impl_def_ids {
728-
self.assemble_inherent_impl_probe(impl_def_id);
760+
self.assemble_inherent_impl_probe(impl_def_id, receiver_trait_derefs);
729761
}
730762
}
731763

732764
#[instrument(level = "debug", skip(self))]
733-
fn assemble_inherent_impl_probe(&mut self, impl_def_id: DefId) {
765+
fn assemble_inherent_impl_probe(&mut self, impl_def_id: DefId, receiver_trait_derefs: usize) {
734766
if !self.impl_dups.insert(impl_def_id) {
735767
return; // already visited
736768
}
@@ -746,14 +778,19 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
746778
item,
747779
kind: InherentImplCandidate(impl_def_id),
748780
import_ids: smallvec![],
781+
receiver_trait_derefs,
749782
},
750783
true,
751784
);
752785
}
753786
}
754787

755788
#[instrument(level = "debug", skip(self))]
756-
fn assemble_inherent_candidates_from_object(&mut self, self_ty: Ty<'tcx>) {
789+
fn assemble_inherent_candidates_from_object(
790+
&mut self,
791+
self_ty: Ty<'tcx>,
792+
receiver_trait_derefs: usize,
793+
) {
757794
let principal = match self_ty.kind() {
758795
ty::Dynamic(ref data, ..) => Some(data),
759796
_ => None,
@@ -782,6 +819,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
782819
item,
783820
kind: ObjectCandidate(new_trait_ref),
784821
import_ids: smallvec![],
822+
receiver_trait_derefs,
785823
},
786824
true,
787825
);
@@ -790,7 +828,11 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
790828
}
791829

792830
#[instrument(level = "debug", skip(self))]
793-
fn assemble_inherent_candidates_from_param(&mut self, param_ty: ty::ParamTy) {
831+
fn assemble_inherent_candidates_from_param(
832+
&mut self,
833+
param_ty: ty::ParamTy,
834+
receiver_trait_derefs: usize,
835+
) {
794836
let bounds = self.param_env.caller_bounds().iter().filter_map(|predicate| {
795837
let bound_predicate = predicate.kind();
796838
match bound_predicate.skip_binder() {
@@ -817,6 +859,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
817859
item,
818860
kind: WhereClauseCandidate(poly_trait_ref),
819861
import_ids: smallvec![],
862+
receiver_trait_derefs,
820863
},
821864
true,
822865
);
@@ -910,6 +953,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
910953
item,
911954
import_ids: import_ids.clone(),
912955
kind: TraitCandidate(bound_trait_ref),
956+
receiver_trait_derefs: 0usize,
913957
},
914958
false,
915959
);
@@ -933,6 +977,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
933977
item,
934978
import_ids: import_ids.clone(),
935979
kind: TraitCandidate(ty::Binder::dummy(trait_ref)),
980+
receiver_trait_derefs: 0usize,
936981
},
937982
false,
938983
);
@@ -1408,6 +1453,7 @@ impl<'tcx> Pick<'tcx> {
14081453
autoref_or_ptr_adjustment: _,
14091454
self_ty,
14101455
unstable_candidates: _,
1456+
receiver_trait_derefs: _,
14111457
} = *self;
14121458
self_ty != other.self_ty || def_id != other.item.def_id
14131459
}
@@ -1777,6 +1823,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
17771823
autoref_or_ptr_adjustment: None,
17781824
self_ty,
17791825
unstable_candidates: vec![],
1826+
receiver_trait_derefs: 0,
17801827
})
17811828
}
17821829

@@ -2070,6 +2117,7 @@ impl<'tcx> Candidate<'tcx> {
20702117
autoref_or_ptr_adjustment: None,
20712118
self_ty,
20722119
unstable_candidates,
2120+
receiver_trait_derefs: self.receiver_trait_derefs,
20732121
}
20742122
}
20752123
}

0 commit comments

Comments
 (0)