-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:
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
}
#![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;
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;
#[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 ();
}
-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
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]
| ^^^^^^^^^^^^^^
| ------------- 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]
| ^^^^^^^^^^^^^^
| ------- 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]
| ^^^^^^^^^^^^^^
| -------------- 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]
| ^^^^^^^^^^^^^^
| -------------------- 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]
| ^^^^^^^^^^^^^^
| -------------- 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`.