@@ -1047,51 +1047,41 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
10471047 err : & mut DiagnosticBuilder < ' _ > ,
10481048 unsatisfied_predicates : & Vec < ( ty:: Predicate < ' tcx > , Option < ty:: Predicate < ' tcx > > ) > ,
10491049 ) {
1050- let derivables = [
1051- sym:: Eq ,
1052- sym:: PartialEq ,
1053- sym:: Ord ,
1054- sym:: PartialOrd ,
1055- sym:: Clone ,
1056- sym:: Copy ,
1057- sym:: Hash ,
1058- sym:: Default ,
1059- sym:: Debug ,
1060- ] ;
1061- let mut derives = unsatisfied_predicates
1062- . iter ( )
1063- . filter_map ( |( pred, _) | {
1064- let trait_pred =
1065- if let ty:: PredicateKind :: Trait ( trait_pred) = pred. kind ( ) . skip_binder ( ) {
1066- trait_pred
1067- } else {
1068- return None ;
1069- } ;
1070- let trait_ref = trait_pred. trait_ref ;
1071- let adt_def = if let ty:: Adt ( adt_def, _) = trait_ref. self_ty ( ) . kind ( ) {
1072- adt_def
1073- } else {
1074- return None ;
1075- } ;
1076- if adt_def. did . is_local ( ) {
1077- let diagnostic_items = self . tcx . diagnostic_items ( trait_ref. def_id . krate ) ;
1078- return derivables. iter ( ) . find_map ( |trait_derivable| {
1079- let item_def_id = diagnostic_items. name_to_id . get ( trait_derivable) ?;
1080- if item_def_id == & trait_pred. trait_ref . def_id
1081- && !( adt_def. is_enum ( ) && * trait_derivable == sym:: Default )
1082- {
1083- return Some ( (
1084- format ! ( "{}" , trait_ref. self_ty( ) ) ,
1085- self . tcx . def_span ( adt_def. did ) ,
1086- format ! ( "{}" , trait_ref. print_only_trait_name( ) ) ,
1087- ) ) ;
1088- }
1089- None
1090- } ) ;
1091- }
1092- None
1093- } )
1094- . collect :: < Vec < ( String , Span , String ) > > ( ) ;
1050+ let mut derives = Vec :: < ( String , Span , String ) > :: new ( ) ;
1051+ let mut traits = Vec :: < Span > :: new ( ) ;
1052+ for ( pred, _) in unsatisfied_predicates {
1053+ let trait_pred = match pred. kind ( ) . skip_binder ( ) {
1054+ ty:: PredicateKind :: Trait ( trait_pred) => trait_pred,
1055+ _ => continue ,
1056+ } ;
1057+ let adt = match trait_pred. self_ty ( ) . ty_adt_def ( ) {
1058+ Some ( adt) if adt. did . is_local ( ) => adt,
1059+ _ => continue ,
1060+ } ;
1061+ let can_derive = match self . tcx . get_diagnostic_name ( trait_pred. def_id ( ) ) {
1062+ Some ( sym:: Default ) => !adt. is_enum ( ) ,
1063+ Some (
1064+ sym:: Eq
1065+ | sym:: PartialEq
1066+ | sym:: Ord
1067+ | sym:: PartialOrd
1068+ | sym:: Clone
1069+ | sym:: Copy
1070+ | sym:: Hash
1071+ | sym:: Debug ,
1072+ ) => true ,
1073+ _ => false ,
1074+ } ;
1075+ if can_derive {
1076+ derives. push ( (
1077+ format ! ( "{}" , trait_pred. self_ty( ) ) ,
1078+ self . tcx . def_span ( adt. did ) ,
1079+ format ! ( "{}" , trait_pred. trait_ref. print_only_trait_name( ) ) ,
1080+ ) ) ;
1081+ } else {
1082+ traits. push ( self . tcx . def_span ( trait_pred. def_id ( ) ) ) ;
1083+ }
1084+ }
10951085 derives. sort ( ) ;
10961086 let derives_grouped = derives. into_iter ( ) . fold (
10971087 Vec :: < ( String , Span , String ) > :: new ( ) ,
@@ -1106,36 +1096,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
11061096 acc
11071097 } ,
11081098 ) ;
1109- let mut traits: Vec < _ > = unsatisfied_predicates
1110- . iter ( )
1111- . filter_map ( |( pred, _) | {
1112- let trait_pred =
1113- if let ty:: PredicateKind :: Trait ( trait_pred) = pred. kind ( ) . skip_binder ( ) {
1114- trait_pred
1115- } else {
1116- return None ;
1117- } ;
1118- if let ty:: Adt ( adt_def, _) = trait_pred. trait_ref . self_ty ( ) . kind ( ) {
1119- if !adt_def. did . is_local ( ) {
1120- return None ;
1121- }
1122- } else {
1123- return None ;
1124- } ;
1125-
1126- let did = trait_pred. def_id ( ) ;
1127- let diagnostic_items = self . tcx . diagnostic_items ( did. krate ) ;
1128-
1129- if !derivables
1130- . iter ( )
1131- . any ( |trait_derivable| diagnostic_items. get ( trait_derivable) == Some ( & did) )
1132- {
1133- Some ( self . tcx . def_span ( did) )
1134- } else {
1135- None
1136- }
1137- } )
1138- . collect ( ) ;
11391099 traits. sort ( ) ;
11401100 traits. dedup ( ) ;
11411101
0 commit comments