@@ -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