@@ -4,17 +4,15 @@ use clippy_utils::source::{snippet_with_applicability, snippet_with_context};
44use clippy_utils:: sugg:: Sugg ;
55use clippy_utils:: ty:: { is_copy, is_type_diagnostic_item, peel_mid_ty_refs_is_mutable, type_is_unsafe_function} ;
66use 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 ,
99} ;
1010use rustc_ast:: util:: parser:: PREC_UNAMBIGUOUS ;
1111use rustc_errors:: Applicability ;
1212use rustc_hir:: def:: Res ;
1313use 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 } ;
1515use rustc_lint:: LateContext ;
16- use rustc_middle:: ty:: adjustment:: Adjust ;
17- use rustc_middle:: ty:: { TypeFlags , TypeVisitableExt } ;
1816use rustc_span:: { sym, SyntaxContext } ;
1917
2018#[ expect( clippy:: too_many_arguments) ]
7573 }
7674
7775 // `map` won't perform any adjustments.
78- if expr_has_type_coercion ( cx, expr) {
76+ if expr_requires_coercion ( cx, expr) {
7977 return None ;
8078 }
8179
@@ -274,71 +272,3 @@ pub(super) fn try_parse_pattern<'tcx>(
274272fn is_none_expr ( cx : & LateContext < ' _ > , expr : & Expr < ' _ > ) -> bool {
275273 is_res_lang_ctor ( cx, path_res ( cx, peel_blocks ( expr) ) , OptionNone )
276274}
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