@@ -3919,7 +3919,7 @@ impl Methods {
3919
3919
}
3920
3920
} ,
3921
3921
( "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 ) ,
3923
3923
Some ( ( name2 @ ( "into_iter" | "iter" | "iter_mut" ) , recv2, [ ] , _, _) ) => {
3924
3924
iter_count:: check ( cx, expr, recv2, name2) ;
3925
3925
} ,
@@ -3973,6 +3973,13 @@ impl Methods {
3973
3973
string_extend_chars:: check ( cx, expr, recv, arg) ;
3974
3974
extend_with_drain:: check ( cx, expr, recv, arg) ;
3975
3975
} ,
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
+ }
3976
3983
( "filter_map" , [ arg] ) => {
3977
3984
unnecessary_filter_map:: check ( cx, expr, arg, name) ;
3978
3985
filter_map_bool_then:: check ( cx, expr, arg, call_span) ;
@@ -3987,7 +3994,7 @@ impl Methods {
3987
3994
} ,
3988
3995
( "flatten" , [ ] ) => match method_call ( recv) {
3989
3996
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 ) ,
3991
3998
_ => { } ,
3992
3999
} ,
3993
4000
( "fold" , [ init, acc] ) => {
@@ -4021,7 +4028,8 @@ impl Methods {
4021
4028
} ,
4022
4029
( "last" , [ ] ) => {
4023
4030
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 ) ;
4025
4033
}
4026
4034
} ,
4027
4035
( "lock" , [ ] ) => {
@@ -4058,7 +4066,7 @@ impl Methods {
4058
4066
( "next" , [ ] ) => {
4059
4067
if let Some ( ( name2, recv2, args2, _, _) ) = method_call ( recv) {
4060
4068
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 ) ,
4062
4070
( "filter" , [ arg] ) => filter_next:: check ( cx, expr, recv2, arg) ,
4063
4071
( "filter_map" , [ arg] ) => filter_map_next:: check ( cx, expr, recv2, arg, & self . msrv ) ,
4064
4072
( "iter" , [ ] ) => iter_next_slice:: check ( cx, expr, recv2) ,
@@ -4071,7 +4079,7 @@ impl Methods {
4071
4079
} ,
4072
4080
( "nth" , [ n_arg] ) => match method_call ( recv) {
4073
4081
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 ) ,
4075
4083
Some ( ( "iter" , recv2, [ ] , _, _) ) => iter_nth:: check ( cx, expr, recv2, recv, n_arg, false ) ,
4076
4084
Some ( ( "iter_mut" , recv2, [ ] , _, _) ) => iter_nth:: check ( cx, expr, recv2, recv, n_arg, true ) ,
4077
4085
_ => iter_nth_zero:: check ( cx, expr, recv, n_arg) ,
@@ -4126,7 +4134,8 @@ impl Methods {
4126
4134
iter_skip_zero:: check ( cx, expr, arg) ;
4127
4135
4128
4136
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 ) ;
4130
4139
}
4131
4140
}
4132
4141
( "sort" , [ ] ) => {
@@ -4152,7 +4161,8 @@ impl Methods {
4152
4161
( "step_by" , [ arg] ) => iterator_step_by_zero:: check ( cx, expr, arg) ,
4153
4162
( "take" , [ _arg] ) => {
4154
4163
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 ) ;
4156
4166
}
4157
4167
} ,
4158
4168
( "take" , [ ] ) => needless_option_take:: check ( cx, expr, recv) ,
0 commit comments