@@ -4,17 +4,15 @@ use clippy_utils::source::{snippet_with_applicability, snippet_with_context};
4
4
use clippy_utils:: sugg:: Sugg ;
5
5
use clippy_utils:: ty:: { is_copy, is_type_diagnostic_item, peel_mid_ty_refs_is_mutable, type_is_unsafe_function} ;
6
6
use clippy_utils:: {
7
- can_move_expr_to_closure, fn_def_id , is_else_clause, is_lint_allowed, is_res_lang_ctor, path_res, path_to_local_id ,
8
- peel_blocks, peel_hir_expr_refs, peel_hir_expr_while, CaptureKind ,
7
+ can_move_expr_to_closure, expr_requires_coercion , is_else_clause, is_lint_allowed, is_res_lang_ctor, path_res,
8
+ path_to_local_id , peel_blocks, peel_hir_expr_refs, peel_hir_expr_while, CaptureKind ,
9
9
} ;
10
10
use rustc_ast:: util:: parser:: PREC_UNAMBIGUOUS ;
11
11
use rustc_errors:: Applicability ;
12
12
use rustc_hir:: def:: Res ;
13
13
use rustc_hir:: LangItem :: { OptionNone , OptionSome } ;
14
- use rustc_hir:: { self as hir , BindingMode , Expr , ExprKind , HirId , Mutability , Pat , PatKind , Path , QPath } ;
14
+ use rustc_hir:: { BindingMode , Expr , ExprKind , HirId , Mutability , Pat , PatKind , Path , QPath } ;
15
15
use rustc_lint:: LateContext ;
16
- use rustc_middle:: ty:: adjustment:: Adjust ;
17
- use rustc_middle:: ty:: { TypeFlags , TypeVisitableExt } ;
18
16
use rustc_span:: { sym, SyntaxContext } ;
19
17
20
18
#[ expect( clippy:: too_many_arguments) ]
75
73
}
76
74
77
75
// `map` won't perform any adjustments.
78
- if expr_has_type_coercion ( cx, expr) {
76
+ if expr_requires_coercion ( cx, expr) {
79
77
return None ;
80
78
}
81
79
@@ -274,71 +272,3 @@ pub(super) fn try_parse_pattern<'tcx>(
274
272
fn is_none_expr ( cx : & LateContext < ' _ > , expr : & Expr < ' _ > ) -> bool {
275
273
is_res_lang_ctor ( cx, path_res ( cx, peel_blocks ( expr) ) , OptionNone )
276
274
}
277
-
278
- fn expr_ty_adjusted ( cx : & LateContext < ' _ > , expr : & Expr < ' _ > ) -> bool {
279
- cx. typeck_results ( )
280
- . expr_adjustments ( expr)
281
- . iter ( )
282
- // We do not care about exprs with `NeverToAny` adjustments, such as `panic!` call.
283
- . any ( |adj| !matches ! ( adj. kind, Adjust :: NeverToAny ) )
284
- }
285
-
286
- fn expr_has_type_coercion < ' tcx > ( cx : & LateContext < ' tcx > , expr : & Expr < ' tcx > ) -> bool {
287
- if expr. span . from_expansion ( ) {
288
- return false ;
289
- }
290
- if expr_ty_adjusted ( cx, expr) {
291
- return true ;
292
- }
293
-
294
- // Identify coercion sites and recursively check it those sites
295
- // actually has type adjustments.
296
- match expr. kind {
297
- // Function/method calls, including enum initialization.
298
- ExprKind :: Call ( _, args) | ExprKind :: MethodCall ( _, _, args, _) if let Some ( def_id) = fn_def_id ( cx, expr) => {
299
- let fn_sig = cx. tcx . fn_sig ( def_id) . instantiate_identity ( ) ;
300
- if !fn_sig. output ( ) . skip_binder ( ) . has_type_flags ( TypeFlags :: HAS_TY_PARAM ) {
301
- return false ;
302
- }
303
- let mut args_with_ty_param = fn_sig
304
- . inputs ( )
305
- . skip_binder ( )
306
- . iter ( )
307
- . zip ( args)
308
- . filter_map ( |( arg_ty, arg) | if arg_ty. has_type_flags ( TypeFlags :: HAS_TY_PARAM ) {
309
- Some ( arg)
310
- } else {
311
- None
312
- } ) ;
313
- args_with_ty_param. any ( |arg| expr_has_type_coercion ( cx, arg) )
314
- } ,
315
- // Struct/union initialization.
316
- ExprKind :: Struct ( _, fields, _) => {
317
- fields. iter ( ) . map ( |expr_field| expr_field. expr ) . any ( |ex| expr_has_type_coercion ( cx, ex) )
318
- } ,
319
- // those two `ref` keywords cannot be removed
320
- #[ allow( clippy:: needless_borrow) ]
321
- // Function results, including the final line of a block or a `return` expression.
322
- ExprKind :: Block ( hir:: Block { expr : Some ( ref ret_expr) , .. } , _) |
323
- ExprKind :: Ret ( Some ( ref ret_expr) ) => expr_has_type_coercion ( cx, ret_expr) ,
324
-
325
- // ===== Coercion-propagation expressions =====
326
-
327
- // Array, where the type is `[U; n]`.
328
- ExprKind :: Array ( elems) |
329
- // Tuple, `(U_0, U_1, ..., U_n)`.
330
- ExprKind :: Tup ( elems) => {
331
- elems. iter ( ) . any ( |elem| expr_has_type_coercion ( cx, elem) )
332
- } ,
333
- // Array but with repeating syntax.
334
- ExprKind :: Repeat ( rep_elem, _) => expr_has_type_coercion ( cx, rep_elem) ,
335
- // Others that may contain coercion sites.
336
- ExprKind :: If ( _, then, maybe_else) => {
337
- expr_has_type_coercion ( cx, then) || maybe_else. is_some_and ( |e| expr_has_type_coercion ( cx, e) )
338
- }
339
- ExprKind :: Match ( _, arms, _) => {
340
- arms. iter ( ) . map ( |arm| arm. body ) . any ( |body| expr_has_type_coercion ( cx, body) )
341
- }
342
- _ => false
343
- }
344
- }
0 commit comments