@@ -296,6 +296,7 @@ pub(crate) fn lookup_method(
296296 env : Arc < TraitEnvironment > ,
297297 krate : CrateId ,
298298 traits_in_scope : & FxHashSet < TraitId > ,
299+ visible_from_module : Option < ModuleId > ,
299300 name : & Name ,
300301) -> Option < ( Ty , FunctionId ) > {
301302 iterate_method_candidates (
@@ -304,6 +305,7 @@ pub(crate) fn lookup_method(
304305 env,
305306 krate,
306307 & traits_in_scope,
308+ visible_from_module,
307309 Some ( name) ,
308310 LookupMode :: MethodCall ,
309311 |ty, f| match f {
@@ -334,6 +336,7 @@ pub fn iterate_method_candidates<T>(
334336 env : Arc < TraitEnvironment > ,
335337 krate : CrateId ,
336338 traits_in_scope : & FxHashSet < TraitId > ,
339+ visible_from_module : Option < ModuleId > ,
337340 name : Option < & Name > ,
338341 mode : LookupMode ,
339342 mut callback : impl FnMut ( & Ty , AssocItemId ) -> Option < T > ,
@@ -345,6 +348,7 @@ pub fn iterate_method_candidates<T>(
345348 env,
346349 krate,
347350 traits_in_scope,
351+ visible_from_module,
348352 name,
349353 mode,
350354 & mut |ty, item| {
@@ -362,6 +366,7 @@ fn iterate_method_candidates_impl(
362366 env : Arc < TraitEnvironment > ,
363367 krate : CrateId ,
364368 traits_in_scope : & FxHashSet < TraitId > ,
369+ visible_from_module : Option < ModuleId > ,
365370 name : Option < & Name > ,
366371 mode : LookupMode ,
367372 callback : & mut dyn FnMut ( & Ty , AssocItemId ) -> bool ,
@@ -399,6 +404,7 @@ fn iterate_method_candidates_impl(
399404 env. clone ( ) ,
400405 krate,
401406 traits_in_scope,
407+ visible_from_module,
402408 name,
403409 callback,
404410 ) {
@@ -415,6 +421,7 @@ fn iterate_method_candidates_impl(
415421 env,
416422 krate,
417423 traits_in_scope,
424+ visible_from_module,
418425 name,
419426 callback,
420427 )
@@ -428,6 +435,7 @@ fn iterate_method_candidates_with_autoref(
428435 env : Arc < TraitEnvironment > ,
429436 krate : CrateId ,
430437 traits_in_scope : & FxHashSet < TraitId > ,
438+ visible_from_module : Option < ModuleId > ,
431439 name : Option < & Name > ,
432440 mut callback : & mut dyn FnMut ( & Ty , AssocItemId ) -> bool ,
433441) -> bool {
@@ -438,6 +446,7 @@ fn iterate_method_candidates_with_autoref(
438446 env. clone ( ) ,
439447 krate,
440448 & traits_in_scope,
449+ visible_from_module,
441450 name,
442451 & mut callback,
443452 ) {
@@ -454,6 +463,7 @@ fn iterate_method_candidates_with_autoref(
454463 env. clone ( ) ,
455464 krate,
456465 & traits_in_scope,
466+ visible_from_module,
457467 name,
458468 & mut callback,
459469 ) {
@@ -470,6 +480,7 @@ fn iterate_method_candidates_with_autoref(
470480 env,
471481 krate,
472482 & traits_in_scope,
483+ visible_from_module,
473484 name,
474485 & mut callback,
475486 ) {
@@ -485,14 +496,23 @@ fn iterate_method_candidates_by_receiver(
485496 env : Arc < TraitEnvironment > ,
486497 krate : CrateId ,
487498 traits_in_scope : & FxHashSet < TraitId > ,
499+ visible_from_module : Option < ModuleId > ,
488500 name : Option < & Name > ,
489501 mut callback : & mut dyn FnMut ( & Ty , AssocItemId ) -> bool ,
490502) -> bool {
491503 // We're looking for methods with *receiver* type receiver_ty. These could
492504 // be found in any of the derefs of receiver_ty, so we have to go through
493505 // that.
494506 for self_ty in std:: iter:: once ( receiver_ty) . chain ( rest_of_deref_chain) {
495- if iterate_inherent_methods ( self_ty, db, name, Some ( receiver_ty) , krate, & mut callback) {
507+ if iterate_inherent_methods (
508+ self_ty,
509+ db,
510+ name,
511+ Some ( receiver_ty) ,
512+ krate,
513+ visible_from_module,
514+ & mut callback,
515+ ) {
496516 return true ;
497517 }
498518 }
@@ -519,10 +539,12 @@ fn iterate_method_candidates_for_self_ty(
519539 env : Arc < TraitEnvironment > ,
520540 krate : CrateId ,
521541 traits_in_scope : & FxHashSet < TraitId > ,
542+ visible_from_module : Option < ModuleId > ,
522543 name : Option < & Name > ,
523544 mut callback : & mut dyn FnMut ( & Ty , AssocItemId ) -> bool ,
524545) -> bool {
525- if iterate_inherent_methods ( self_ty, db, name, None , krate, & mut callback) {
546+ if iterate_inherent_methods ( self_ty, db, name, None , krate, visible_from_module, & mut callback)
547+ {
526548 return true ;
527549 }
528550 iterate_trait_method_candidates ( self_ty, db, env, krate, traits_in_scope, name, None , callback)
@@ -559,7 +581,9 @@ fn iterate_trait_method_candidates(
559581 // iteration
560582 let mut known_implemented = false ;
561583 for ( _name, item) in data. items . iter ( ) {
562- if !is_valid_candidate ( db, name, receiver_ty, * item, self_ty) {
584+ // Don't pass a `visible_from_module` down to `is_valid_candidate`,
585+ // since only inherent methods should be included into visibility checking.
586+ if !is_valid_candidate ( db, name, receiver_ty, * item, self_ty, None ) {
563587 continue ;
564588 }
565589 if !known_implemented {
@@ -583,6 +607,7 @@ fn iterate_inherent_methods(
583607 name : Option < & Name > ,
584608 receiver_ty : Option < & Canonical < Ty > > ,
585609 krate : CrateId ,
610+ visible_from_module : Option < ModuleId > ,
586611 callback : & mut dyn FnMut ( & Ty , AssocItemId ) -> bool ,
587612) -> bool {
588613 let def_crates = match self_ty. value . def_crates ( db, krate) {
@@ -594,7 +619,7 @@ fn iterate_inherent_methods(
594619
595620 for & impl_def in impls. for_self_ty ( & self_ty. value ) {
596621 for & item in db. impl_data ( impl_def) . items . iter ( ) {
597- if !is_valid_candidate ( db, name, receiver_ty, item, self_ty) {
622+ if !is_valid_candidate ( db, name, receiver_ty, item, self_ty, visible_from_module ) {
598623 continue ;
599624 }
600625 // we have to check whether the self type unifies with the type
@@ -639,6 +664,7 @@ fn is_valid_candidate(
639664 receiver_ty : Option < & Canonical < Ty > > ,
640665 item : AssocItemId ,
641666 self_ty : & Canonical < Ty > ,
667+ visible_from_module : Option < ModuleId > ,
642668) -> bool {
643669 match item {
644670 AssocItemId :: FunctionId ( m) => {
@@ -660,6 +686,13 @@ fn is_valid_candidate(
660686 return false ;
661687 }
662688 }
689+ if let Some ( from_module) = visible_from_module {
690+ if !db. function_visibility ( m) . is_visible_from ( db. upcast ( ) , from_module) {
691+ cov_mark:: hit!( autoderef_candidate_not_visible) ;
692+ return false ;
693+ }
694+ }
695+
663696 true
664697 }
665698 AssocItemId :: ConstId ( c) => {
0 commit comments