Skip to content

Commit ddafe23

Browse files
committed
Consider lint check attributes on match arms in late lints
Additionally add analogous test for early lints.
1 parent 19ca569 commit ddafe23

File tree

5 files changed

+82
-41
lines changed

5 files changed

+82
-41
lines changed

compiler/rustc_lint/src/late.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,10 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas
240240
}
241241

242242
fn visit_arm(&mut self, a: &'tcx hir::Arm<'tcx>) {
243-
lint_callback!(self, check_arm, a);
244-
hir_visit::walk_arm(self, a);
243+
self.with_lint_attrs(a.hir_id, |cx| {
244+
lint_callback!(cx, check_arm, a);
245+
hir_visit::walk_arm(cx, a);
246+
})
245247
}
246248

247249
fn visit_generic_param(&mut self, p: &'tcx hir::GenericParam<'tcx>) {

tests/ui/lint/lint-attr-everywhere-early.rs

+8
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,14 @@ fn expressions() {
134134
}
135135
}
136136

137+
match f {
138+
#[deny(ellipsis_inclusive_range_patterns)]
139+
Match{f1: 0...100} => {}
140+
//~^ ERROR range patterns are deprecated
141+
//~| WARNING this is accepted in the current edition
142+
_ => {}
143+
}
144+
137145
// Statement Block
138146
{
139147
#![deny(unsafe_code)]

tests/ui/lint/lint-attr-everywhere-early.stderr

+31-17
Original file line numberDiff line numberDiff line change
@@ -384,103 +384,117 @@ note: the lint level is defined here
384384
LL | #[deny(while_true)]
385385
| ^^^^^^^^^^
386386

387+
error: `...` range patterns are deprecated
388+
--> $DIR/lint-attr-everywhere-early.rs:139:20
389+
|
390+
LL | Match{f1: 0...100} => {}
391+
| ^^^ help: use `..=` for an inclusive range
392+
|
393+
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
394+
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
395+
note: the lint level is defined here
396+
--> $DIR/lint-attr-everywhere-early.rs:138:16
397+
|
398+
LL | #[deny(ellipsis_inclusive_range_patterns)]
399+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
400+
387401
error: usage of an `unsafe` block
388-
--> $DIR/lint-attr-everywhere-early.rs:140:9
402+
--> $DIR/lint-attr-everywhere-early.rs:148:9
389403
|
390404
LL | unsafe {}
391405
| ^^^^^^^^^
392406
|
393407
note: the lint level is defined here
394-
--> $DIR/lint-attr-everywhere-early.rs:139:17
408+
--> $DIR/lint-attr-everywhere-early.rs:147:17
395409
|
396410
LL | #![deny(unsafe_code)]
397411
| ^^^^^^^^^^^
398412

399413
error: usage of an `unsafe` block
400-
--> $DIR/lint-attr-everywhere-early.rs:144:9
414+
--> $DIR/lint-attr-everywhere-early.rs:152:9
401415
|
402416
LL | unsafe {}
403417
| ^^^^^^^^^
404418
|
405419
note: the lint level is defined here
406-
--> $DIR/lint-attr-everywhere-early.rs:143:16
420+
--> $DIR/lint-attr-everywhere-early.rs:151:16
407421
|
408422
LL | #[deny(unsafe_code)]
409423
| ^^^^^^^^^^^
410424

411425
error: usage of an `unsafe` block
412-
--> $DIR/lint-attr-everywhere-early.rs:149:5
426+
--> $DIR/lint-attr-everywhere-early.rs:157:5
413427
|
414428
LL | unsafe {};
415429
| ^^^^^^^^^
416430
|
417431
note: the lint level is defined here
418-
--> $DIR/lint-attr-everywhere-early.rs:148:12
432+
--> $DIR/lint-attr-everywhere-early.rs:156:12
419433
|
420434
LL | #[deny(unsafe_code)]
421435
| ^^^^^^^^^^^
422436

423437
error: usage of an `unsafe` block
424-
--> $DIR/lint-attr-everywhere-early.rs:151:27
438+
--> $DIR/lint-attr-everywhere-early.rs:159:27
425439
|
426440
LL | [#[deny(unsafe_code)] unsafe {123}];
427441
| ^^^^^^^^^^^^
428442
|
429443
note: the lint level is defined here
430-
--> $DIR/lint-attr-everywhere-early.rs:151:13
444+
--> $DIR/lint-attr-everywhere-early.rs:159:13
431445
|
432446
LL | [#[deny(unsafe_code)] unsafe {123}];
433447
| ^^^^^^^^^^^
434448

435449
error: usage of an `unsafe` block
436-
--> $DIR/lint-attr-everywhere-early.rs:152:27
450+
--> $DIR/lint-attr-everywhere-early.rs:160:27
437451
|
438452
LL | (#[deny(unsafe_code)] unsafe {123},);
439453
| ^^^^^^^^^^^^
440454
|
441455
note: the lint level is defined here
442-
--> $DIR/lint-attr-everywhere-early.rs:152:13
456+
--> $DIR/lint-attr-everywhere-early.rs:160:13
443457
|
444458
LL | (#[deny(unsafe_code)] unsafe {123},);
445459
| ^^^^^^^^^^^
446460

447461
error: usage of an `unsafe` block
448-
--> $DIR/lint-attr-everywhere-early.rs:154:31
462+
--> $DIR/lint-attr-everywhere-early.rs:162:31
449463
|
450464
LL | call(#[deny(unsafe_code)] unsafe {123});
451465
| ^^^^^^^^^^^^
452466
|
453467
note: the lint level is defined here
454-
--> $DIR/lint-attr-everywhere-early.rs:154:17
468+
--> $DIR/lint-attr-everywhere-early.rs:162:17
455469
|
456470
LL | call(#[deny(unsafe_code)] unsafe {123});
457471
| ^^^^^^^^^^^
458472

459473
error: usage of an `unsafe` block
460-
--> $DIR/lint-attr-everywhere-early.rs:156:38
474+
--> $DIR/lint-attr-everywhere-early.rs:164:38
461475
|
462476
LL | TupleStruct(#[deny(unsafe_code)] unsafe {123});
463477
| ^^^^^^^^^^^^
464478
|
465479
note: the lint level is defined here
466-
--> $DIR/lint-attr-everywhere-early.rs:156:24
480+
--> $DIR/lint-attr-everywhere-early.rs:164:24
467481
|
468482
LL | TupleStruct(#[deny(unsafe_code)] unsafe {123});
469483
| ^^^^^^^^^^^
470484

471485
error: `...` range patterns are deprecated
472-
--> $DIR/lint-attr-everywhere-early.rs:167:18
486+
--> $DIR/lint-attr-everywhere-early.rs:175:18
473487
|
474488
LL | f1: 0...100,
475489
| ^^^ help: use `..=` for an inclusive range
476490
|
477491
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
478492
= note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
479493
note: the lint level is defined here
480-
--> $DIR/lint-attr-everywhere-early.rs:166:20
494+
--> $DIR/lint-attr-everywhere-early.rs:174:20
481495
|
482496
LL | #[deny(ellipsis_inclusive_range_patterns)]
483497
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
484498

485-
error: aborting due to 36 previous errors
499+
error: aborting due to 37 previous errors
486500

tests/ui/lint/lint-attr-everywhere-late.rs

+5
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,11 @@ fn expressions() {
162162
}
163163
}
164164

165+
match 123 {
166+
#[deny(non_snake_case)]
167+
ARM_VAR => {} //~ ERROR variable `ARM_VAR` should have a snake case name
168+
}
169+
165170
// Statement Block
166171
{
167172
#![deny(enum_intrinsics_non_enums)]

tests/ui/lint/lint-attr-everywhere-late.stderr

+34-22
Original file line numberDiff line numberDiff line change
@@ -305,124 +305,136 @@ note: the lint level is defined here
305305
LL | #[deny(enum_intrinsics_non_enums)]
306306
| ^^^^^^^^^^^^^^^^^^^^^^^^^
307307

308+
error: variable `ARM_VAR` should have a snake case name
309+
--> $DIR/lint-attr-everywhere-late.rs:167:9
310+
|
311+
LL | ARM_VAR => {}
312+
| ^^^^^^^ help: convert the identifier to snake case: `arm_var`
313+
|
314+
note: the lint level is defined here
315+
--> $DIR/lint-attr-everywhere-late.rs:166:16
316+
|
317+
LL | #[deny(non_snake_case)]
318+
| ^^^^^^^^^^^^^^
319+
308320
error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
309-
--> $DIR/lint-attr-everywhere-late.rs:168:9
321+
--> $DIR/lint-attr-everywhere-late.rs:173:9
310322
|
311323
LL | discriminant::<i32>(&123);
312324
| ^^^^^^^^^^^^^^^^^^^^^^^^^
313325
|
314326
note: the argument to `discriminant` should be a reference to an enum, but it was passed a reference to a `i32`, which is not an enum.
315-
--> $DIR/lint-attr-everywhere-late.rs:168:29
327+
--> $DIR/lint-attr-everywhere-late.rs:173:29
316328
|
317329
LL | discriminant::<i32>(&123);
318330
| ^^^^
319331
note: the lint level is defined here
320-
--> $DIR/lint-attr-everywhere-late.rs:167:17
332+
--> $DIR/lint-attr-everywhere-late.rs:172:17
321333
|
322334
LL | #![deny(enum_intrinsics_non_enums)]
323335
| ^^^^^^^^^^^^^^^^^^^^^^^^^
324336

325337
error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
326-
--> $DIR/lint-attr-everywhere-late.rs:172:9
338+
--> $DIR/lint-attr-everywhere-late.rs:177:9
327339
|
328340
LL | discriminant::<i32>(&123);
329341
| ^^^^^^^^^^^^^^^^^^^^^^^^^
330342
|
331343
note: the argument to `discriminant` should be a reference to an enum, but it was passed a reference to a `i32`, which is not an enum.
332-
--> $DIR/lint-attr-everywhere-late.rs:172:29
344+
--> $DIR/lint-attr-everywhere-late.rs:177:29
333345
|
334346
LL | discriminant::<i32>(&123);
335347
| ^^^^
336348
note: the lint level is defined here
337-
--> $DIR/lint-attr-everywhere-late.rs:171:16
349+
--> $DIR/lint-attr-everywhere-late.rs:176:16
338350
|
339351
LL | #[deny(enum_intrinsics_non_enums)]
340352
| ^^^^^^^^^^^^^^^^^^^^^^^^^
341353

342354
error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
343-
--> $DIR/lint-attr-everywhere-late.rs:177:5
355+
--> $DIR/lint-attr-everywhere-late.rs:182:5
344356
|
345357
LL | discriminant::<i32>(&123);
346358
| ^^^^^^^^^^^^^^^^^^^^^^^^^
347359
|
348360
note: the argument to `discriminant` should be a reference to an enum, but it was passed a reference to a `i32`, which is not an enum.
349-
--> $DIR/lint-attr-everywhere-late.rs:177:25
361+
--> $DIR/lint-attr-everywhere-late.rs:182:25
350362
|
351363
LL | discriminant::<i32>(&123);
352364
| ^^^^
353365
note: the lint level is defined here
354-
--> $DIR/lint-attr-everywhere-late.rs:176:12
366+
--> $DIR/lint-attr-everywhere-late.rs:181:12
355367
|
356368
LL | #[deny(enum_intrinsics_non_enums)]
357369
| ^^^^^^^^^^^^^^^^^^^^^^^^^
358370

359371
error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
360-
--> $DIR/lint-attr-everywhere-late.rs:179:41
372+
--> $DIR/lint-attr-everywhere-late.rs:184:41
361373
|
362374
LL | [#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123)];
363375
| ^^^^^^^^^^^^^^^^^^^^^^^^^
364376
|
365377
note: the argument to `discriminant` should be a reference to an enum, but it was passed a reference to a `i32`, which is not an enum.
366-
--> $DIR/lint-attr-everywhere-late.rs:179:61
378+
--> $DIR/lint-attr-everywhere-late.rs:184:61
367379
|
368380
LL | [#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123)];
369381
| ^^^^
370382
note: the lint level is defined here
371-
--> $DIR/lint-attr-everywhere-late.rs:179:13
383+
--> $DIR/lint-attr-everywhere-late.rs:184:13
372384
|
373385
LL | [#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123)];
374386
| ^^^^^^^^^^^^^^^^^^^^^^^^^
375387

376388
error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
377-
--> $DIR/lint-attr-everywhere-late.rs:180:41
389+
--> $DIR/lint-attr-everywhere-late.rs:185:41
378390
|
379391
LL | (#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123),);
380392
| ^^^^^^^^^^^^^^^^^^^^^^^^^
381393
|
382394
note: the argument to `discriminant` should be a reference to an enum, but it was passed a reference to a `i32`, which is not an enum.
383-
--> $DIR/lint-attr-everywhere-late.rs:180:61
395+
--> $DIR/lint-attr-everywhere-late.rs:185:61
384396
|
385397
LL | (#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123),);
386398
| ^^^^
387399
note: the lint level is defined here
388-
--> $DIR/lint-attr-everywhere-late.rs:180:13
400+
--> $DIR/lint-attr-everywhere-late.rs:185:13
389401
|
390402
LL | (#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123),);
391403
| ^^^^^^^^^^^^^^^^^^^^^^^^^
392404

393405
error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
394-
--> $DIR/lint-attr-everywhere-late.rs:182:45
406+
--> $DIR/lint-attr-everywhere-late.rs:187:45
395407
|
396408
LL | call(#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123));
397409
| ^^^^^^^^^^^^^^^^^^^^^^^^^
398410
|
399411
note: the argument to `discriminant` should be a reference to an enum, but it was passed a reference to a `i32`, which is not an enum.
400-
--> $DIR/lint-attr-everywhere-late.rs:182:65
412+
--> $DIR/lint-attr-everywhere-late.rs:187:65
401413
|
402414
LL | call(#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123));
403415
| ^^^^
404416
note: the lint level is defined here
405-
--> $DIR/lint-attr-everywhere-late.rs:182:17
417+
--> $DIR/lint-attr-everywhere-late.rs:187:17
406418
|
407419
LL | call(#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123));
408420
| ^^^^^^^^^^^^^^^^^^^^^^^^^
409421

410422
error: the return value of `mem::discriminant` is unspecified when called with a non-enum type
411-
--> $DIR/lint-attr-everywhere-late.rs:184:52
423+
--> $DIR/lint-attr-everywhere-late.rs:189:52
412424
|
413425
LL | TupleStruct(#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123));
414426
| ^^^^^^^^^^^^^^^^^^^^^^^^^
415427
|
416428
note: the argument to `discriminant` should be a reference to an enum, but it was passed a reference to a `i32`, which is not an enum.
417-
--> $DIR/lint-attr-everywhere-late.rs:184:72
429+
--> $DIR/lint-attr-everywhere-late.rs:189:72
418430
|
419431
LL | TupleStruct(#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123));
420432
| ^^^^
421433
note: the lint level is defined here
422-
--> $DIR/lint-attr-everywhere-late.rs:184:24
434+
--> $DIR/lint-attr-everywhere-late.rs:189:24
423435
|
424436
LL | TupleStruct(#[deny(enum_intrinsics_non_enums)] discriminant::<i32>(&123));
425437
| ^^^^^^^^^^^^^^^^^^^^^^^^^
426438

427-
error: aborting due to 31 previous errors
439+
error: aborting due to 32 previous errors
428440

0 commit comments

Comments
 (0)