@@ -3,7 +3,8 @@ use clippy_utils::source::{snippet_with_applicability, snippet_with_context};
3
3
use clippy_utils:: sugg:: has_enclosing_paren;
4
4
use clippy_utils:: ty:: { implements_trait, is_manually_drop, peel_mid_ty_refs} ;
5
5
use clippy_utils:: {
6
- expr_use_ctxt, get_parent_expr, is_block_like, is_lint_allowed, path_to_local, DefinedTy , ExprUseNode ,
6
+ expr_use_ctxt, get_parent_expr, is_block_like, is_lint_allowed, path_to_local, peel_middle_ty_refs, DefinedTy ,
7
+ ExprUseNode ,
7
8
} ;
8
9
use core:: mem;
9
10
use rustc_ast:: util:: parser:: { PREC_POSTFIX , PREC_PREFIX } ;
@@ -1044,16 +1045,28 @@ fn report<'tcx>(
1044
1045
return ;
1045
1046
}
1046
1047
1047
- let ( prefix, precedence) = if let Some ( mutability) = mutability
1048
- && !typeck. expr_ty ( expr) . is_ref ( )
1048
+ let ty = typeck. expr_ty ( expr) ;
1049
+
1050
+ // `&&[T; N]`, or `&&..&[T; N]` (src) cannot coerce to `&[T]` (dst).
1051
+ if let ty:: Ref ( _, dst, _) = data. adjusted_ty . kind ( )
1052
+ && dst. is_slice ( )
1049
1053
{
1050
- let prefix = match mutability {
1051
- Mutability :: Not => "&" ,
1052
- Mutability :: Mut => "&mut " ,
1053
- } ;
1054
- ( prefix, PREC_PREFIX )
1055
- } else {
1056
- ( "" , 0 )
1054
+ let ( src, n_src_refs) = peel_middle_ty_refs ( ty) ;
1055
+ if n_src_refs >= 2 && src. is_array ( ) {
1056
+ return ;
1057
+ }
1058
+ }
1059
+
1060
+ let ( prefix, precedence) = match mutability {
1061
+ Some ( mutability) if !ty. is_ref ( ) => {
1062
+ let prefix = match mutability {
1063
+ Mutability :: Not => "&" ,
1064
+ Mutability :: Mut => "&mut " ,
1065
+ } ;
1066
+ ( prefix, PREC_PREFIX )
1067
+ } ,
1068
+ None if !ty. is_ref ( ) && data. adjusted_ty . is_ref ( ) => ( "&" , 0 ) ,
1069
+ _ => ( "" , 0 ) ,
1057
1070
} ;
1058
1071
span_lint_hir_and_then (
1059
1072
cx,
0 commit comments