@@ -35,6 +35,24 @@ use crate::errors::{LifetimesOrBoundsMismatchOnTrait, MethodShouldReturnFuture};
3535
3636mod  refine; 
3737
38+ /// Call the query `tcx.compare_impl_item()` directly instead. 
39+ pub ( super )  fn  compare_impl_item ( 
40+     tcx :  TyCtxt < ' _ > , 
41+     impl_item_def_id :  LocalDefId , 
42+ )  -> Result < ( ) ,  ErrorGuaranteed >  { 
43+     let  impl_item = tcx. associated_item ( impl_item_def_id) ; 
44+     let  trait_item = tcx. associated_item ( impl_item. trait_item_def_id . unwrap ( ) ) ; 
45+     let  impl_trait_ref =
46+         tcx. impl_trait_ref ( impl_item. container_id ( tcx) ) . unwrap ( ) . instantiate_identity ( ) ; 
47+     debug ! ( ?impl_trait_ref) ; 
48+ 
49+     match  impl_item. kind  { 
50+         ty:: AssocKind :: Fn  => compare_impl_method ( tcx,  impl_item,  trait_item,  impl_trait_ref) , 
51+         ty:: AssocKind :: Type  => compare_impl_ty ( tcx,  impl_item,  trait_item,  impl_trait_ref) , 
52+         ty:: AssocKind :: Const  => compare_impl_const ( tcx,  impl_item,  trait_item,  impl_trait_ref) , 
53+     } 
54+ } 
55+ 
3856/// Checks that a method from an impl conforms to the signature of 
3957/// the same method as declared in the trait. 
4058/// 
@@ -44,22 +62,21 @@ mod refine;
4462/// - `trait_m`: the method in the trait 
4563/// - `impl_trait_ref`: the TraitRef corresponding to the trait implementation 
4664#[ instrument( level = "debug" ,  skip( tcx) ) ]  
47- pub ( super )   fn  compare_impl_method < ' tcx > ( 
65+ fn  compare_impl_method < ' tcx > ( 
4866    tcx :  TyCtxt < ' tcx > , 
4967    impl_m :  ty:: AssocItem , 
5068    trait_m :  ty:: AssocItem , 
5169    impl_trait_ref :  ty:: TraitRef < ' tcx > , 
52- )  { 
53-     let  _:  Result < _ ,  ErrorGuaranteed >  = try { 
54-         check_method_is_structurally_compatible ( tcx,  impl_m,  trait_m,  impl_trait_ref,  false ) ?; 
55-         compare_method_predicate_entailment ( tcx,  impl_m,  trait_m,  impl_trait_ref) ?; 
56-         refine:: check_refining_return_position_impl_trait_in_trait ( 
57-             tcx, 
58-             impl_m, 
59-             trait_m, 
60-             impl_trait_ref, 
61-         ) ; 
62-     } ; 
70+ )  -> Result < ( ) ,  ErrorGuaranteed >  { 
71+     check_method_is_structurally_compatible ( tcx,  impl_m,  trait_m,  impl_trait_ref,  false ) ?; 
72+     compare_method_predicate_entailment ( tcx,  impl_m,  trait_m,  impl_trait_ref) ?; 
73+     refine:: check_refining_return_position_impl_trait_in_trait ( 
74+         tcx, 
75+         impl_m, 
76+         trait_m, 
77+         impl_trait_ref, 
78+     ) ; 
79+     Ok ( ( ) ) 
6380} 
6481
6582/// Checks a bunch of different properties of the impl/trait methods for 
@@ -1727,17 +1744,12 @@ fn compare_generic_param_kinds<'tcx>(
17271744    Ok ( ( ) ) 
17281745} 
17291746
1730- /// Use `tcx.compare_impl_const` instead 
1731- pub ( super )  fn  compare_impl_const_raw ( 
1732-     tcx :  TyCtxt < ' _ > , 
1733-     ( impl_const_item_def,  trait_const_item_def) :  ( LocalDefId ,  DefId ) , 
1747+ fn  compare_impl_const < ' tcx > ( 
1748+     tcx :  TyCtxt < ' tcx > , 
1749+     impl_const_item :  ty:: AssocItem , 
1750+     trait_const_item :  ty:: AssocItem , 
1751+     impl_trait_ref :  ty:: TraitRef < ' tcx > , 
17341752)  -> Result < ( ) ,  ErrorGuaranteed >  { 
1735-     let  impl_const_item = tcx. associated_item ( impl_const_item_def) ; 
1736-     let  trait_const_item = tcx. associated_item ( trait_const_item_def) ; 
1737-     let  impl_trait_ref =
1738-         tcx. impl_trait_ref ( impl_const_item. container_id ( tcx) ) . unwrap ( ) . instantiate_identity ( ) ; 
1739-     debug ! ( ?impl_trait_ref) ; 
1740- 
17411753    compare_number_of_generics ( tcx,  impl_const_item,  trait_const_item,  false ) ?; 
17421754    compare_generic_param_kinds ( tcx,  impl_const_item,  trait_const_item,  false ) ?; 
17431755    check_region_bounds_on_impl_item ( tcx,  impl_const_item,  trait_const_item,  false ) ?; 
@@ -1868,19 +1880,17 @@ fn compare_const_predicate_entailment<'tcx>(
18681880} 
18691881
18701882#[ instrument( level = "debug" ,  skip( tcx) ) ]  
1871- pub ( super )   fn  compare_impl_ty < ' tcx > ( 
1883+ fn  compare_impl_ty < ' tcx > ( 
18721884    tcx :  TyCtxt < ' tcx > , 
18731885    impl_ty :  ty:: AssocItem , 
18741886    trait_ty :  ty:: AssocItem , 
18751887    impl_trait_ref :  ty:: TraitRef < ' tcx > , 
1876- )  { 
1877-     let  _:  Result < ( ) ,  ErrorGuaranteed >  = try { 
1878-         compare_number_of_generics ( tcx,  impl_ty,  trait_ty,  false ) ?; 
1879-         compare_generic_param_kinds ( tcx,  impl_ty,  trait_ty,  false ) ?; 
1880-         check_region_bounds_on_impl_item ( tcx,  impl_ty,  trait_ty,  false ) ?; 
1881-         compare_type_predicate_entailment ( tcx,  impl_ty,  trait_ty,  impl_trait_ref) ?; 
1882-         check_type_bounds ( tcx,  trait_ty,  impl_ty,  impl_trait_ref) ?; 
1883-     } ; 
1888+ )  -> Result < ( ) ,  ErrorGuaranteed >  { 
1889+     compare_number_of_generics ( tcx,  impl_ty,  trait_ty,  false ) ?; 
1890+     compare_generic_param_kinds ( tcx,  impl_ty,  trait_ty,  false ) ?; 
1891+     check_region_bounds_on_impl_item ( tcx,  impl_ty,  trait_ty,  false ) ?; 
1892+     compare_type_predicate_entailment ( tcx,  impl_ty,  trait_ty,  impl_trait_ref) ?; 
1893+     check_type_bounds ( tcx,  trait_ty,  impl_ty,  impl_trait_ref) 
18841894} 
18851895
18861896/// The equivalent of [compare_method_predicate_entailment], but for associated types 
0 commit comments