@@ -16,7 +16,7 @@ use rustc_data_structures::fx::FxHashMap;
16
16
use rustc_errors:: { error_code, pluralize, struct_span_err, Applicability } ;
17
17
use rustc_parse:: validate_attr;
18
18
use rustc_session:: lint:: builtin:: PATTERNS_IN_FNS_WITHOUT_BODY ;
19
- use rustc_session:: lint:: LintBuffer ;
19
+ use rustc_session:: lint:: { BuiltinLintDiagnostics , LintBuffer } ;
20
20
use rustc_session:: Session ;
21
21
use rustc_span:: symbol:: { kw, sym, Ident } ;
22
22
use rustc_span:: Span ;
@@ -213,14 +213,14 @@ impl<'a> AstValidator<'a> {
213
213
err. emit ( ) ;
214
214
}
215
215
216
- fn check_decl_no_pat ( decl : & FnDecl , mut report_err : impl FnMut ( Span , bool ) ) {
216
+ fn check_decl_no_pat ( decl : & FnDecl , mut report_err : impl FnMut ( Span , Option < Ident > , bool ) ) {
217
217
for Param { pat, .. } in & decl. inputs {
218
218
match pat. kind {
219
219
PatKind :: Ident ( BindingMode :: ByValue ( Mutability :: Not ) , _, None ) | PatKind :: Wild => { }
220
- PatKind :: Ident ( BindingMode :: ByValue ( Mutability :: Mut ) , _ , None ) => {
221
- report_err ( pat. span , true )
220
+ PatKind :: Ident ( BindingMode :: ByValue ( Mutability :: Mut ) , ident , None ) => {
221
+ report_err ( pat. span , Some ( ident ) , true )
222
222
}
223
- _ => report_err ( pat. span , false ) ,
223
+ _ => report_err ( pat. span , None , false ) ,
224
224
}
225
225
}
226
226
}
@@ -815,7 +815,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
815
815
match ty. kind {
816
816
TyKind :: BareFn ( ref bfty) => {
817
817
self . check_fn_decl ( & bfty. decl , SelfSemantic :: No ) ;
818
- Self :: check_decl_no_pat ( & bfty. decl , |span, _| {
818
+ Self :: check_decl_no_pat ( & bfty. decl , |span, _, _ | {
819
819
struct_span_err ! (
820
820
self . session,
821
821
span,
@@ -1285,7 +1285,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1285
1285
1286
1286
// Functions without bodies cannot have patterns.
1287
1287
if let FnKind :: Fn ( ctxt, _, sig, _, None ) = fk {
1288
- Self :: check_decl_no_pat ( & sig. decl , |span, mut_ident| {
1288
+ Self :: check_decl_no_pat ( & sig. decl , |span, ident , mut_ident| {
1289
1289
let ( code, msg, label) = match ctxt {
1290
1290
FnCtxt :: Foreign => (
1291
1291
error_code ! ( E0130 ) ,
@@ -1299,7 +1299,16 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1299
1299
) ,
1300
1300
} ;
1301
1301
if mut_ident && matches ! ( ctxt, FnCtxt :: Assoc ( _) ) {
1302
- self . lint_buffer . buffer_lint ( PATTERNS_IN_FNS_WITHOUT_BODY , id, span, msg) ;
1302
+ if let Some ( ident) = ident {
1303
+ let diag = BuiltinLintDiagnostics :: PatternsInFnsWithoutBody ( span, ident) ;
1304
+ self . lint_buffer . buffer_lint_with_diagnostic (
1305
+ PATTERNS_IN_FNS_WITHOUT_BODY ,
1306
+ id,
1307
+ span,
1308
+ msg,
1309
+ diag,
1310
+ )
1311
+ }
1303
1312
} else {
1304
1313
self . err_handler ( )
1305
1314
. struct_span_err ( span, msg)
0 commit comments