@@ -13,9 +13,7 @@ use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
13
13
use rustc_data_structures:: sorted_map:: SortedMap ;
14
14
use rustc_data_structures:: unord:: UnordSet ;
15
15
use rustc_errors:: codes:: * ;
16
- use rustc_errors:: {
17
- Applicability , Diag , DiagStyledString , MultiSpan , StashKey , pluralize, struct_span_code_err,
18
- } ;
16
+ use rustc_errors:: { Applicability , Diag , MultiSpan , StashKey , pluralize, struct_span_code_err} ;
19
17
use rustc_hir:: attrs:: AttributeKind ;
20
18
use rustc_hir:: def:: { CtorKind , DefKind , Res } ;
21
19
use rustc_hir:: def_id:: DefId ;
@@ -1560,11 +1558,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1560
1558
) ;
1561
1559
}
1562
1560
1563
- if rcvr_ty. is_numeric ( ) && rcvr_ty. is_fresh ( )
1564
- || restrict_type_params
1565
- || suggested_derive
1566
- || self . lookup_alternative_tuple_impls ( & mut err, & unsatisfied_predicates)
1567
- {
1561
+ if rcvr_ty. is_numeric ( ) && rcvr_ty. is_fresh ( ) || restrict_type_params || suggested_derive {
1568
1562
} else {
1569
1563
self . suggest_traits_to_import (
1570
1564
& mut err,
@@ -1741,119 +1735,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1741
1735
err. emit ( )
1742
1736
}
1743
1737
1744
- /// If the predicate failure is caused by an unmet bound on a tuple, recheck if the bound would
1745
- /// succeed if all the types on the tuple had no borrows. This is a common problem for libraries
1746
- /// like Bevy and ORMs, which rely heavily on traits being implemented on tuples.
1747
- fn lookup_alternative_tuple_impls (
1748
- & self ,
1749
- err : & mut Diag < ' _ > ,
1750
- unsatisfied_predicates : & [ (
1751
- ty:: Predicate < ' tcx > ,
1752
- Option < ty:: Predicate < ' tcx > > ,
1753
- Option < ObligationCause < ' tcx > > ,
1754
- ) ] ,
1755
- ) -> bool {
1756
- let mut found_tuple = false ;
1757
- for ( pred, root, _ob) in unsatisfied_predicates {
1758
- let mut preds = vec ! [ pred] ;
1759
- if let Some ( root) = root {
1760
- // We will look at both the current predicate and the root predicate that caused it
1761
- // to be needed. If calling something like `<(A, &B)>::default()`, then `pred` is
1762
- // `&B: Default` and `root` is `(A, &B): Default`, which is the one we are checking
1763
- // for further down, so we check both.
1764
- preds. push ( root) ;
1765
- }
1766
- for pred in preds {
1767
- if let Some ( clause) = pred. as_clause ( )
1768
- && let Some ( clause) = clause. as_trait_clause ( )
1769
- && let ty = clause. self_ty ( ) . skip_binder ( )
1770
- && let ty:: Tuple ( types) = ty. kind ( )
1771
- {
1772
- let path = clause. skip_binder ( ) . trait_ref . print_only_trait_path ( ) ;
1773
- let def_id = clause. def_id ( ) ;
1774
- let ty = Ty :: new_tup (
1775
- self . tcx ,
1776
- self . tcx . mk_type_list_from_iter ( types. iter ( ) . map ( |ty| ty. peel_refs ( ) ) ) ,
1777
- ) ;
1778
- let args = ty:: GenericArgs :: for_item ( self . tcx , def_id, |param, _| {
1779
- if param. index == 0 {
1780
- ty. into ( )
1781
- } else {
1782
- self . infcx . var_for_def ( DUMMY_SP , param)
1783
- }
1784
- } ) ;
1785
- if self
1786
- . infcx
1787
- . type_implements_trait ( def_id, args, self . param_env )
1788
- . must_apply_modulo_regions ( )
1789
- {
1790
- // "`Trait` is implemented for `(A, B)` but not for `(A, &B)`"
1791
- let mut msg = DiagStyledString :: normal ( format ! ( "`{path}` " ) ) ;
1792
- msg. push_highlighted ( "is" ) ;
1793
- msg. push_normal ( " implemented for `(" ) ;
1794
- let len = types. len ( ) ;
1795
- for ( i, t) in types. iter ( ) . enumerate ( ) {
1796
- msg. push (
1797
- format ! ( "{}" , with_forced_trimmed_paths!( t. peel_refs( ) ) ) ,
1798
- t. peel_refs ( ) != t,
1799
- ) ;
1800
- if i < len - 1 {
1801
- msg. push_normal ( ", " ) ;
1802
- }
1803
- }
1804
- msg. push_normal ( ")` but " ) ;
1805
- msg. push_highlighted ( "not" ) ;
1806
- msg. push_normal ( " for `(" ) ;
1807
- for ( i, t) in types. iter ( ) . enumerate ( ) {
1808
- msg. push (
1809
- format ! ( "{}" , with_forced_trimmed_paths!( t) ) ,
1810
- t. peel_refs ( ) != t,
1811
- ) ;
1812
- if i < len - 1 {
1813
- msg. push_normal ( ", " ) ;
1814
- }
1815
- }
1816
- msg. push_normal ( ")`" ) ;
1817
-
1818
- // Find the span corresponding to the impl that was found to point at it.
1819
- if let Some ( impl_span) = self
1820
- . tcx
1821
- . all_impls ( def_id)
1822
- . filter ( |& impl_def_id| {
1823
- let header = self . tcx . impl_trait_header ( impl_def_id) . unwrap ( ) ;
1824
- let trait_ref = header. trait_ref . instantiate (
1825
- self . tcx ,
1826
- self . infcx . fresh_args_for_item ( DUMMY_SP , impl_def_id) ,
1827
- ) ;
1828
-
1829
- let value = ty:: fold_regions ( self . tcx , ty, |_, _| {
1830
- self . tcx . lifetimes . re_erased
1831
- } ) ;
1832
- // FIXME: Don't bother dealing with non-lifetime binders here...
1833
- if value. has_escaping_bound_vars ( ) {
1834
- return false ;
1835
- }
1836
- self . infcx . can_eq ( ty:: ParamEnv :: empty ( ) , trait_ref. self_ty ( ) , value)
1837
- && header. polarity == ty:: ImplPolarity :: Positive
1838
- } )
1839
- . map ( |impl_def_id| self . tcx . def_span ( impl_def_id) )
1840
- . next ( )
1841
- {
1842
- err. highlighted_span_note ( impl_span, msg. 0 ) ;
1843
- } else {
1844
- err. highlighted_note ( msg. 0 ) ;
1845
- }
1846
- found_tuple = true ;
1847
- }
1848
- // If `pred` was already on the tuple, we don't need to look at the root
1849
- // obligation too.
1850
- break ;
1851
- }
1852
- }
1853
- }
1854
- found_tuple
1855
- }
1856
-
1857
1738
/// If an appropriate error source is not found, check method chain for possible candidates
1858
1739
fn lookup_segments_chain_for_no_match_method (
1859
1740
& self ,
0 commit comments