@@ -88,8 +88,9 @@ pub(crate) struct ProbeContext<'a, 'tcx> {
88
88
89
89
/// Number of times we've hopped along the chain of `Receiver::Target`.
90
90
/// Used to spot cases where an "outer" method in a smart pointer might
91
- /// "shadow" a pre-existing method in the pointee.
92
- receiver_trait_derefs : usize ,
91
+ /// "shadow" a pre-existing method in the pointee. Only applies for inherent
92
+ /// methods.
93
+ receiver_trait_derefs : Option < usize > ,
93
94
}
94
95
95
96
impl < ' a , ' tcx > Deref for ProbeContext < ' a , ' tcx > {
@@ -104,7 +105,7 @@ pub(crate) struct Candidate<'tcx> {
104
105
pub ( crate ) item : ty:: AssocItem ,
105
106
pub ( crate ) kind : CandidateKind < ' tcx > ,
106
107
pub ( crate ) import_ids : SmallVec < [ LocalDefId ; 1 ] > ,
107
- receiver_trait_derefs : usize ,
108
+ receiver_trait_derefs : Option < usize > ,
108
109
}
109
110
110
111
#[ derive( Debug , Clone ) ]
@@ -183,7 +184,7 @@ struct PickDiagHints<'a, 'tcx> {
183
184
#[ derive( Debug ) ]
184
185
struct PickConstraintsForShadowed {
185
186
autoderefs : usize ,
186
- receiver_trait_derefs : usize ,
187
+ receiver_trait_derefs : Option < usize > ,
187
188
def_id : DefId ,
188
189
}
189
190
@@ -192,8 +193,11 @@ impl PickConstraintsForShadowed {
192
193
autoderefs == self . autoderefs
193
194
}
194
195
195
- fn may_shadow_based_on_receiver_trait_derefs ( & self , receiver_trait_derefs : usize ) -> bool {
196
- receiver_trait_derefs != self . receiver_trait_derefs
196
+ fn may_shadow_based_on_receiver_trait_derefs (
197
+ & self ,
198
+ receiver_trait_derefs : Option < usize > ,
199
+ ) -> bool {
200
+ receiver_trait_derefs != self . receiver_trait_derefs && receiver_trait_derefs. is_some ( )
197
201
}
198
202
199
203
fn may_shadow_based_on_defid ( & self , def_id : DefId ) -> bool {
@@ -223,7 +227,8 @@ pub(crate) struct Pick<'tcx> {
223
227
224
228
/// Number of jumps along the `Receiver::Target` chain we followed
225
229
/// to identify this method. Used only for deshadowing errors.
226
- pub receiver_trait_derefs : usize ,
230
+ /// Only applies for inherent impls.
231
+ pub receiver_trait_derefs : Option < usize > ,
227
232
}
228
233
229
234
#[ derive( Clone , Debug , PartialEq , Eq ) ]
@@ -708,7 +713,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
708
713
static_candidates : RefCell :: new ( Vec :: new ( ) ) ,
709
714
scope_expr_id,
710
715
is_suggestion,
711
- receiver_trait_derefs : 0usize ,
716
+ receiver_trait_derefs : None ,
712
717
}
713
718
}
714
719
@@ -765,9 +770,11 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
765
770
766
771
fn assemble_inherent_candidates ( & mut self ) {
767
772
for step in self . steps . iter ( ) {
768
- self . receiver_trait_derefs = step. autoderefs ;
773
+ self . receiver_trait_derefs = Some ( step. autoderefs ) ;
769
774
self . assemble_probe ( & step. self_ty ) ;
770
775
}
776
+ // FIXME pass on stack again probably
777
+ self . receiver_trait_derefs = None ;
771
778
}
772
779
773
780
#[ instrument( level = "debug" , skip( self ) ) ]
@@ -2039,11 +2046,11 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
2039
2046
item : probes[ 0 ] . 0 . item ,
2040
2047
kind : TraitPick ,
2041
2048
import_ids : probes[ 0 ] . 0 . import_ids . clone ( ) ,
2042
- autoderefs : probes [ 0 ] . 0 . receiver_trait_derefs ,
2049
+ autoderefs : 0 ,
2043
2050
autoref_or_ptr_adjustment : None ,
2044
2051
self_ty,
2045
2052
unstable_candidates : vec ! [ ] ,
2046
- receiver_trait_derefs : 0 ,
2053
+ receiver_trait_derefs : probes [ 0 ] . 0 . receiver_trait_derefs ,
2047
2054
} )
2048
2055
}
2049
2056
0 commit comments