@@ -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
}
@@ -834,7 +834,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
834
834
match ty. kind {
835
835
TyKind :: BareFn ( ref bfty) => {
836
836
self . check_fn_decl ( & bfty. decl , SelfSemantic :: No ) ;
837
- Self :: check_decl_no_pat ( & bfty. decl , |span, _| {
837
+ Self :: check_decl_no_pat ( & bfty. decl , |span, _, _ | {
838
838
struct_span_err ! (
839
839
self . session,
840
840
span,
@@ -1289,7 +1289,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1289
1289
1290
1290
// Functions without bodies cannot have patterns.
1291
1291
if let FnKind :: Fn ( ctxt, _, sig, _, None ) = fk {
1292
- Self :: check_decl_no_pat ( & sig. decl , |span, mut_ident| {
1292
+ Self :: check_decl_no_pat ( & sig. decl , |span, ident , mut_ident| {
1293
1293
let ( code, msg, label) = match ctxt {
1294
1294
FnCtxt :: Foreign => (
1295
1295
error_code ! ( E0130 ) ,
@@ -1303,7 +1303,16 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1303
1303
) ,
1304
1304
} ;
1305
1305
if mut_ident && matches ! ( ctxt, FnCtxt :: Assoc ( _) ) {
1306
- self . lint_buffer . buffer_lint ( PATTERNS_IN_FNS_WITHOUT_BODY , id, span, msg) ;
1306
+ if let Some ( ident) = ident {
1307
+ let diag = BuiltinLintDiagnostics :: PatternsInFnsWithoutBody ( span, ident) ;
1308
+ self . lint_buffer . buffer_lint_with_diagnostic (
1309
+ PATTERNS_IN_FNS_WITHOUT_BODY ,
1310
+ id,
1311
+ span,
1312
+ msg,
1313
+ diag,
1314
+ )
1315
+ }
1307
1316
} else {
1308
1317
self . err_handler ( )
1309
1318
. struct_span_err ( span, msg)
0 commit comments