@@ -1047,51 +1047,41 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1047
1047
err : & mut DiagnosticBuilder < ' _ > ,
1048
1048
unsatisfied_predicates : & Vec < ( ty:: Predicate < ' tcx > , Option < ty:: Predicate < ' tcx > > ) > ,
1049
1049
) {
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
+ }
1095
1085
derives. sort ( ) ;
1096
1086
let derives_grouped = derives. into_iter ( ) . fold (
1097
1087
Vec :: < ( String , Span , String ) > :: new ( ) ,
@@ -1106,36 +1096,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1106
1096
acc
1107
1097
} ,
1108
1098
) ;
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 ( ) ;
1139
1099
traits. sort ( ) ;
1140
1100
traits. dedup ( ) ;
1141
1101
0 commit comments