diff --git a/compiler/rustc_error_codes/src/error_codes/E0788.md b/compiler/rustc_error_codes/src/error_codes/E0788.md index 68bd53cea6f..d26f9b59455 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0788.md +++ b/compiler/rustc_error_codes/src/error_codes/E0788.md @@ -1,5 +1,10 @@ -A `#[no_coverage]` attribute was incorrectly placed on something that couldn't -be covered. +A `#[no_coverage]` attribute was applied to something which does not show up +in code coverage, or is too granular to be excluded from the coverage report. + +For now, this attribute can only be applied to function, method, and closure +definitions. In the future, it may be added to statements, blocks, and +expressions, and for the time being, using this attribute in those places +will just emit an `unused_attributes` lint instead of this error. Example of erroneous code: diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs index f3734e1a120..67144d03d98 100644 --- a/compiler/rustc_passes/src/check_attr.rs +++ b/compiler/rustc_passes/src/check_attr.rs @@ -317,14 +317,15 @@ impl CheckAttrVisitor<'_> { Target::Mod | Target::ForeignMod | Target::Impl | Target::Trait => { self.tcx.struct_span_lint_hir(UNUSED_ATTRIBUTES, hir_id, attr.span, |lint| { - lint.build("`#[no_coverage]` cannot be done recursively and must be applied to functions directly").emit(); + lint.build("`#[no_coverage]` does not propagate into items and must be applied to the contained functions directly").emit(); }); true } Target::Expression | Target::Statement | Target::Arm => { self.tcx.struct_span_lint_hir(UNUSED_ATTRIBUTES, hir_id, attr.span, |lint| { - lint.build("`#[no_coverage]` can only be applied at the function level, not on code directly").emit(); + lint.build("`#[no_coverage]` may only be applied to function definitions") + .emit(); }); true } diff --git a/src/test/ui/lint/no-coverage.rs b/src/test/ui/lint/no-coverage.rs index c02cd976bc9..ff24c12b2bc 100644 --- a/src/test/ui/lint/no-coverage.rs +++ b/src/test/ui/lint/no-coverage.rs @@ -2,7 +2,11 @@ #![feature(no_coverage)] #![feature(type_alias_impl_trait)] #![warn(unused_attributes)] +#![no_coverage] +//~^ WARN: `#[no_coverage]` does not propagate into items and must be applied to the contained functions directly +#[no_coverage] +//~^ WARN: `#[no_coverage]` does not propagate into items and must be applied to the contained functions directly trait Trait { #[no_coverage] //~ ERROR `#[no_coverage]` must be applied to coverable code const X: u32; @@ -13,6 +17,8 @@ trait Trait { type U; } +#[no_coverage] +//~^ WARN: `#[no_coverage]` does not propagate into items and must be applied to the contained functions directly impl Trait for () { const X: u32 = 0; @@ -33,14 +39,17 @@ extern "C" { #[no_coverage] fn main() { - #[no_coverage] //~ WARN `#[no_coverage]` can only be applied at the function level, not on code directly + #[no_coverage] + //~^ WARN `#[no_coverage]` may only be applied to function definitions let _ = (); match () { - #[no_coverage] //~ WARN `#[no_coverage]` can only be applied at the function level, not on code directly + #[no_coverage] + //~^ WARN `#[no_coverage]` may only be applied to function definitions () => (), } - #[no_coverage] //~ WARN `#[no_coverage]` can only be applied at the function level, not on code directly + #[no_coverage] + //~^ WARN `#[no_coverage]` may only be applied to function definitions return (); } diff --git a/src/test/ui/lint/no-coverage.stderr b/src/test/ui/lint/no-coverage.stderr index 8549eb699ee..8452ccc7a03 100644 --- a/src/test/ui/lint/no-coverage.stderr +++ b/src/test/ui/lint/no-coverage.stderr @@ -1,8 +1,8 @@ -warning: `#[no_coverage]` can only be applied at the function level, not on code directly - --> $DIR/no-coverage.rs:36:5 +warning: `#[no_coverage]` does not propagate into items and must be applied to the contained functions directly + --> $DIR/no-coverage.rs:8:1 | -LL | #[no_coverage] - | ^^^^^^^^^^^^^^ +LL | #[no_coverage] + | ^^^^^^^^^^^^^^ | note: the lint level is defined here --> $DIR/no-coverage.rs:4:9 @@ -10,20 +10,32 @@ note: the lint level is defined here LL | #![warn(unused_attributes)] | ^^^^^^^^^^^^^^^^^ -warning: `#[no_coverage]` can only be applied at the function level, not on code directly - --> $DIR/no-coverage.rs:40:9 +warning: `#[no_coverage]` does not propagate into items and must be applied to the contained functions directly + --> $DIR/no-coverage.rs:20:1 + | +LL | #[no_coverage] + | ^^^^^^^^^^^^^^ + +warning: `#[no_coverage]` may only be applied to function definitions + --> $DIR/no-coverage.rs:42:5 + | +LL | #[no_coverage] + | ^^^^^^^^^^^^^^ + +warning: `#[no_coverage]` may only be applied to function definitions + --> $DIR/no-coverage.rs:47:9 | LL | #[no_coverage] | ^^^^^^^^^^^^^^ -warning: `#[no_coverage]` can only be applied at the function level, not on code directly - --> $DIR/no-coverage.rs:44:5 +warning: `#[no_coverage]` may only be applied to function definitions + --> $DIR/no-coverage.rs:52:5 | LL | #[no_coverage] | ^^^^^^^^^^^^^^ error[E0788]: `#[no_coverage]` must be applied to coverable code - --> $DIR/no-coverage.rs:7:5 + --> $DIR/no-coverage.rs:11:5 | LL | #[no_coverage] | ^^^^^^^^^^^^^^ @@ -31,7 +43,7 @@ LL | const X: u32; | ------------- not coverable code error[E0788]: `#[no_coverage]` must be applied to coverable code - --> $DIR/no-coverage.rs:10:5 + --> $DIR/no-coverage.rs:14:5 | LL | #[no_coverage] | ^^^^^^^^^^^^^^ @@ -39,7 +51,7 @@ LL | type T; | ------- not coverable code error[E0788]: `#[no_coverage]` must be applied to coverable code - --> $DIR/no-coverage.rs:19:5 + --> $DIR/no-coverage.rs:25:5 | LL | #[no_coverage] | ^^^^^^^^^^^^^^ @@ -47,7 +59,7 @@ LL | type T = Self; | -------------- not coverable code error[E0788]: `#[no_coverage]` must be applied to coverable code - --> $DIR/no-coverage.rs:22:5 + --> $DIR/no-coverage.rs:28:5 | LL | #[no_coverage] | ^^^^^^^^^^^^^^ @@ -55,7 +67,7 @@ LL | type U = impl Trait; | -------------------- not coverable code error[E0788]: `#[no_coverage]` must be applied to coverable code - --> $DIR/no-coverage.rs:27:5 + --> $DIR/no-coverage.rs:33:5 | LL | #[no_coverage] | ^^^^^^^^^^^^^^ @@ -63,21 +75,27 @@ LL | static X: u32; | -------------- not coverable code error[E0788]: `#[no_coverage]` must be applied to coverable code - --> $DIR/no-coverage.rs:30:5 + --> $DIR/no-coverage.rs:36:5 | LL | #[no_coverage] | ^^^^^^^^^^^^^^ LL | type T; | ------- not coverable code +warning: `#[no_coverage]` does not propagate into items and must be applied to the contained functions directly + --> $DIR/no-coverage.rs:5:1 + | +LL | #![no_coverage] + | ^^^^^^^^^^^^^^^ + error: unconstrained opaque type - --> $DIR/no-coverage.rs:23:14 + --> $DIR/no-coverage.rs:29:14 | LL | type U = impl Trait; | ^^^^^^^^^^ | = note: `U` must be used in combination with a concrete type within the same module -error: aborting due to 7 previous errors; 3 warnings emitted +error: aborting due to 7 previous errors; 6 warnings emitted For more information about this error, try `rustc --explain E0788`.