@@ -6,6 +6,7 @@ use rustc_data_structures::packed::Pu128;
6
6
use rustc_errors:: Applicability ;
7
7
use rustc_hir:: { ConstArgKind , ExprKind , Node } ;
8
8
use rustc_lint:: { LateContext , LateLintPass } ;
9
+ use rustc_middle:: ty:: IsSuggestable ;
9
10
use rustc_session:: declare_lint_pass;
10
11
11
12
declare_clippy_lint ! {
@@ -72,6 +73,7 @@ fn inner_check(cx: &LateContext<'_>, expr: &'_ rustc_hir::Expr<'_>, inner_expr:
72
73
// check if expr is a call or has a call inside it
73
74
if inner_expr. can_have_side_effects ( ) {
74
75
let parent_hir_node = cx. tcx . parent_hir_node ( expr. hir_id ) ;
76
+ let inner_expr_ty = cx. typeck_results ( ) . expr_ty ( inner_expr) ;
75
77
let return_type = cx. typeck_results ( ) . expr_ty ( expr) ;
76
78
77
79
let inner_expr = snippet ( cx, inner_expr. span . source_callsite ( ) , ".." ) ;
@@ -94,18 +96,25 @@ fn inner_check(cx: &LateContext<'_>, expr: &'_ rustc_hir::Expr<'_>, inner_expr:
94
96
) ,
95
97
_ => ( expr. span , format ! ( "{{ {inner_expr}; {vec}[] as {return_type} }}" ) ) ,
96
98
} ;
99
+ let span = span. source_callsite ( ) ;
97
100
span_lint_and_then (
98
101
cx,
99
102
ZERO_REPEAT_SIDE_EFFECTS ,
100
- span. source_callsite ( ) ,
103
+ span,
101
104
"expression with side effects as the initial value in a zero-sized array initializer" ,
102
105
|diag| {
103
- diag. span_suggestion_verbose (
104
- span. source_callsite ( ) ,
105
- "consider performing the side effect separately" ,
106
- sugg,
107
- Applicability :: Unspecified ,
108
- ) ;
106
+ if ( !inner_expr_ty. is_never ( ) || cx. tcx . features ( ) . never_type ( ) )
107
+ && return_type. is_suggestable ( cx. tcx , true )
108
+ {
109
+ diag. span_suggestion_verbose (
110
+ span,
111
+ "consider performing the side effect separately" ,
112
+ sugg,
113
+ Applicability :: Unspecified ,
114
+ ) ;
115
+ } else {
116
+ diag. span_help ( span, "consider performing the side effect separately" ) ;
117
+ }
109
118
} ,
110
119
) ;
111
120
}
0 commit comments