@@ -35,6 +35,24 @@ use crate::errors::{LifetimesOrBoundsMismatchOnTrait, MethodShouldReturnFuture};
35
35
36
36
mod refine;
37
37
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
+
38
56
/// Checks that a method from an impl conforms to the signature of
39
57
/// the same method as declared in the trait.
40
58
///
@@ -44,22 +62,21 @@ mod refine;
44
62
/// - `trait_m`: the method in the trait
45
63
/// - `impl_trait_ref`: the TraitRef corresponding to the trait implementation
46
64
#[ instrument( level = "debug" , skip( tcx) ) ]
47
- pub ( super ) fn compare_impl_method < ' tcx > (
65
+ fn compare_impl_method < ' tcx > (
48
66
tcx : TyCtxt < ' tcx > ,
49
67
impl_m : ty:: AssocItem ,
50
68
trait_m : ty:: AssocItem ,
51
69
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 ( ( ) )
63
80
}
64
81
65
82
/// Checks a bunch of different properties of the impl/trait methods for
@@ -1727,17 +1744,12 @@ fn compare_generic_param_kinds<'tcx>(
1727
1744
Ok ( ( ) )
1728
1745
}
1729
1746
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 > ,
1734
1752
) -> 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
-
1741
1753
compare_number_of_generics ( tcx, impl_const_item, trait_const_item, false ) ?;
1742
1754
compare_generic_param_kinds ( tcx, impl_const_item, trait_const_item, false ) ?;
1743
1755
check_region_bounds_on_impl_item ( tcx, impl_const_item, trait_const_item, false ) ?;
@@ -1868,19 +1880,17 @@ fn compare_const_predicate_entailment<'tcx>(
1868
1880
}
1869
1881
1870
1882
#[ instrument( level = "debug" , skip( tcx) ) ]
1871
- pub ( super ) fn compare_impl_ty < ' tcx > (
1883
+ fn compare_impl_ty < ' tcx > (
1872
1884
tcx : TyCtxt < ' tcx > ,
1873
1885
impl_ty : ty:: AssocItem ,
1874
1886
trait_ty : ty:: AssocItem ,
1875
1887
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)
1884
1894
}
1885
1895
1886
1896
/// The equivalent of [compare_method_predicate_entailment], but for associated types
0 commit comments