@@ -3919,7 +3919,7 @@ impl Methods {
39193919 }
39203920 } ,
39213921 ( "count" , [ ] ) if is_trait_method ( cx, expr, sym:: Iterator ) => match method_call ( recv) {
3922- Some ( ( "cloned" , recv2, [ ] , _, _) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, true , false ) ,
3922+ Some ( ( "cloned" , recv2, [ ] , _, _) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, iter_overeager_cloned :: Op :: RmCloned , false ) ,
39233923 Some ( ( name2 @ ( "into_iter" | "iter" | "iter_mut" ) , recv2, [ ] , _, _) ) => {
39243924 iter_count:: check ( cx, expr, recv2, name2) ;
39253925 } ,
@@ -3973,6 +3973,13 @@ impl Methods {
39733973 string_extend_chars:: check ( cx, expr, recv, arg) ;
39743974 extend_with_drain:: check ( cx, expr, recv, arg) ;
39753975 } ,
3976+ ( name @ ( "filter" | "find" ) , [ arg] ) => {
3977+ if let Some ( ( "cloned" , recv2, [ ] , _span2, _) ) = method_call ( recv) {
3978+ // if `arg` has side-effect, the semantic will change
3979+ iter_overeager_cloned:: check ( cx, expr, recv, recv2,
3980+ iter_overeager_cloned:: Op :: FixClosure ( name, arg) , false ) ;
3981+ }
3982+ }
39763983 ( "filter_map" , [ arg] ) => {
39773984 unnecessary_filter_map:: check ( cx, expr, arg, name) ;
39783985 filter_map_bool_then:: check ( cx, expr, arg, call_span) ;
@@ -3987,7 +3994,7 @@ impl Methods {
39873994 } ,
39883995 ( "flatten" , [ ] ) => match method_call ( recv) {
39893996 Some ( ( "map" , recv, [ map_arg] , map_span, _) ) => map_flatten:: check ( cx, expr, recv, map_arg, map_span) ,
3990- Some ( ( "cloned" , recv2, [ ] , _, _) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , true ) ,
3997+ Some ( ( "cloned" , recv2, [ ] , _, _) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, iter_overeager_cloned :: Op :: LaterCloned , true ) ,
39913998 _ => { } ,
39923999 } ,
39934000 ( "fold" , [ init, acc] ) => {
@@ -4021,7 +4028,8 @@ impl Methods {
40214028 } ,
40224029 ( "last" , [ ] ) => {
40234030 if let Some ( ( "cloned" , recv2, [ ] , _span2, _) ) = method_call ( recv) {
4024- iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , false ) ;
4031+ iter_overeager_cloned:: check ( cx, expr, recv, recv2,
4032+ iter_overeager_cloned:: Op :: LaterCloned , false ) ;
40254033 }
40264034 } ,
40274035 ( "lock" , [ ] ) => {
@@ -4058,7 +4066,7 @@ impl Methods {
40584066 ( "next" , [ ] ) => {
40594067 if let Some ( ( name2, recv2, args2, _, _) ) = method_call ( recv) {
40604068 match ( name2, args2) {
4061- ( "cloned" , [ ] ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , false ) ,
4069+ ( "cloned" , [ ] ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, iter_overeager_cloned :: Op :: LaterCloned , false ) ,
40624070 ( "filter" , [ arg] ) => filter_next:: check ( cx, expr, recv2, arg) ,
40634071 ( "filter_map" , [ arg] ) => filter_map_next:: check ( cx, expr, recv2, arg, & self . msrv ) ,
40644072 ( "iter" , [ ] ) => iter_next_slice:: check ( cx, expr, recv2) ,
@@ -4071,7 +4079,7 @@ impl Methods {
40714079 } ,
40724080 ( "nth" , [ n_arg] ) => match method_call ( recv) {
40734081 Some ( ( "bytes" , recv2, [ ] , _, _) ) => bytes_nth:: check ( cx, expr, recv2, n_arg) ,
4074- Some ( ( "cloned" , recv2, [ ] , _, _) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , false ) ,
4082+ Some ( ( "cloned" , recv2, [ ] , _, _) ) => iter_overeager_cloned:: check ( cx, expr, recv, recv2, iter_overeager_cloned :: Op :: LaterCloned , false ) ,
40754083 Some ( ( "iter" , recv2, [ ] , _, _) ) => iter_nth:: check ( cx, expr, recv2, recv, n_arg, false ) ,
40764084 Some ( ( "iter_mut" , recv2, [ ] , _, _) ) => iter_nth:: check ( cx, expr, recv2, recv, n_arg, true ) ,
40774085 _ => iter_nth_zero:: check ( cx, expr, recv, n_arg) ,
@@ -4126,7 +4134,8 @@ impl Methods {
41264134 iter_skip_zero:: check ( cx, expr, arg) ;
41274135
41284136 if let Some ( ( "cloned" , recv2, [ ] , _span2, _) ) = method_call ( recv) {
4129- iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , false ) ;
4137+ iter_overeager_cloned:: check ( cx, expr, recv, recv2,
4138+ iter_overeager_cloned:: Op :: LaterCloned , false ) ;
41304139 }
41314140 }
41324141 ( "sort" , [ ] ) => {
@@ -4152,7 +4161,8 @@ impl Methods {
41524161 ( "step_by" , [ arg] ) => iterator_step_by_zero:: check ( cx, expr, arg) ,
41534162 ( "take" , [ _arg] ) => {
41544163 if let Some ( ( "cloned" , recv2, [ ] , _span2, _) ) = method_call ( recv) {
4155- iter_overeager_cloned:: check ( cx, expr, recv, recv2, false , false ) ;
4164+ iter_overeager_cloned:: check ( cx, expr, recv, recv2,
4165+ iter_overeager_cloned:: Op :: LaterCloned , false ) ;
41564166 }
41574167 } ,
41584168 ( "take" , [ ] ) => needless_option_take:: check ( cx, expr, recv) ,
0 commit comments