coverage: Bless coverage attribute tests

This commit is contained in:
Zalathar 2024-06-20 18:13:48 +10:00
parent b7c057c9b2
commit 1852141219
10 changed files with 667 additions and 284 deletions

View File

@ -1,58 +1,45 @@
#![feature(coverage_attribute)] #![feature(coverage_attribute)]
//@ edition: 2021
// Tests the error messages produced (or not produced) by various unusual // Tests the error messages produced (or not produced) by various unusual
// uses of the `#[coverage(..)]` attribute. // uses of the `#[coverage(..)]` attribute.
// FIXME(#126658): Multiple coverage attributes with the same value are useless, #[coverage(off)] //~ ERROR multiple `coverage` attributes
// and should probably produce a diagnostic.
#[coverage(off)]
#[coverage(off)] #[coverage(off)]
fn multiple_consistent() {} fn multiple_consistent() {}
// FIXME(#126658): When there are multiple inconsistent coverage attributes, #[coverage(off)] //~ ERROR multiple `coverage` attributes
// it's unclear which one will prevail.
#[coverage(off)]
#[coverage(on)] #[coverage(on)]
fn multiple_inconsistent() {} fn multiple_inconsistent() {}
#[coverage] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage] //~ ERROR malformed `coverage` attribute input
fn bare_word() {} fn bare_word() {}
// FIXME(#126658): This shows as multiple different errors, one of which suggests #[coverage = true] //~ ERROR malformed `coverage` attribute input
// writing bare `#[coverage]`, which is not allowed.
#[coverage = true]
//~^ ERROR expected `coverage(off)` or `coverage(on)`
//~| ERROR malformed `coverage` attribute input
//~| HELP the following are the possible correct uses
//~| SUGGESTION #[coverage(on|off)]
fn key_value() {} fn key_value() {}
#[coverage()] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage()] //~ ERROR malformed `coverage` attribute input
fn list_empty() {} fn list_empty() {}
#[coverage(off, off)] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage(off, off)] //~ ERROR malformed `coverage` attribute input
fn list_consistent() {} fn list_consistent() {}
#[coverage(off, on)] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage(off, on)] //~ ERROR malformed `coverage` attribute input
fn list_inconsistent() {} fn list_inconsistent() {}
#[coverage(bogus)] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage(bogus)] //~ ERROR malformed `coverage` attribute input
fn bogus_word() {} fn bogus_word() {}
#[coverage(bogus, off)] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage(bogus, off)] //~ ERROR malformed `coverage` attribute input
fn bogus_word_before() {} fn bogus_word_before() {}
#[coverage(off, bogus)] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage(off, bogus)] //~ ERROR malformed `coverage` attribute input
fn bogus_word_after() {} fn bogus_word_after() {}
#[coverage(off,)] #[coverage(off,)] // (OK!)
fn comma_after() {} fn comma_after() {}
// FIXME(#126658): This shows as multiple different errors. #[coverage(,off)] //~ ERROR expected identifier, found `,`
#[coverage(,off)]
//~^ ERROR expected identifier, found `,`
//~| HELP remove this comma
//~| ERROR expected `coverage(off)` or `coverage(on)`
fn comma_before() {} fn comma_before() {}
fn main() {} fn main() {}

View File

@ -1,18 +1,109 @@
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/bad-syntax.rs:23:1 --> $DIR/bad-syntax.rs:15:1
|
LL | #[coverage]
| ^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: malformed `coverage` attribute input
--> $DIR/bad-syntax.rs:18:1
| |
LL | #[coverage = true] LL | #[coverage = true]
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: malformed `coverage` attribute input
--> $DIR/bad-syntax.rs:21:1
| |
LL | #[coverage] LL | #[coverage()]
| ^^^^^^^^^^^^^
| |
help: the following are the possible correct uses
|
LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: malformed `coverage` attribute input
--> $DIR/bad-syntax.rs:24:1
|
LL | #[coverage(off, off)]
| ^^^^^^^^^^^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: malformed `coverage` attribute input
--> $DIR/bad-syntax.rs:27:1
|
LL | #[coverage(off, on)]
| ^^^^^^^^^^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: malformed `coverage` attribute input
--> $DIR/bad-syntax.rs:30:1
|
LL | #[coverage(bogus)]
| ^^^^^^^^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: malformed `coverage` attribute input
--> $DIR/bad-syntax.rs:33:1
|
LL | #[coverage(bogus, off)]
| ^^^^^^^^^^^^^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: malformed `coverage` attribute input
--> $DIR/bad-syntax.rs:36:1
|
LL | #[coverage(off, bogus)]
| ^^^^^^^^^^^^^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: expected identifier, found `,` error: expected identifier, found `,`
--> $DIR/bad-syntax.rs:52:12 --> $DIR/bad-syntax.rs:42:12
| |
LL | #[coverage(,off)] LL | #[coverage(,off)]
| ^ | ^
@ -20,59 +111,29 @@ LL | #[coverage(,off)]
| expected identifier | expected identifier
| help: remove this comma | help: remove this comma
error: expected `coverage(off)` or `coverage(on)` error: multiple `coverage` attributes
--> $DIR/bad-syntax.rs:18:1 --> $DIR/bad-syntax.rs:7:1
| |
LL | #[coverage] LL | #[coverage(off)]
| ^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^ help: remove this attribute
|
note: attribute also specified here
--> $DIR/bad-syntax.rs:8:1
|
LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^
error: expected `coverage(off)` or `coverage(on)` error: multiple `coverage` attributes
--> $DIR/bad-syntax.rs:23:1 --> $DIR/bad-syntax.rs:11:1
| |
LL | #[coverage = true] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^ help: remove this attribute
error: expected `coverage(off)` or `coverage(on)`
--> $DIR/bad-syntax.rs:30:1
| |
LL | #[coverage()] note: attribute also specified here
| ^^^^^^^^^^^^^ --> $DIR/bad-syntax.rs:12:1
error: expected `coverage(off)` or `coverage(on)`
--> $DIR/bad-syntax.rs:33:1
| |
LL | #[coverage(off, off)] LL | #[coverage(on)]
| ^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
error: expected `coverage(off)` or `coverage(on)`
--> $DIR/bad-syntax.rs:36:1
|
LL | #[coverage(off, on)]
| ^^^^^^^^^^^^^^^^^^^^
error: expected `coverage(off)` or `coverage(on)`
--> $DIR/bad-syntax.rs:39:1
|
LL | #[coverage(bogus)]
| ^^^^^^^^^^^^^^^^^^
error: expected `coverage(off)` or `coverage(on)`
--> $DIR/bad-syntax.rs:42:1
|
LL | #[coverage(bogus, off)]
| ^^^^^^^^^^^^^^^^^^^^^^^
error: expected `coverage(off)` or `coverage(on)`
--> $DIR/bad-syntax.rs:45:1
|
LL | #[coverage(off, bogus)]
| ^^^^^^^^^^^^^^^^^^^^^^^
error: expected `coverage(off)` or `coverage(on)`
--> $DIR/bad-syntax.rs:52:1
|
LL | #[coverage(,off)]
| ^^^^^^^^^^^^^^^^^
error: aborting due to 11 previous errors error: aborting due to 11 previous errors

View File

@ -8,57 +8,62 @@
// and in places that cannot have a coverage attribute, to demonstrate the // and in places that cannot have a coverage attribute, to demonstrate the
// interaction between multiple errors. // interaction between multiple errors.
// FIXME(#126658): The error messages for using this syntax are inconsistent #[coverage = "off"]
// with the error message in other cases. They also sometimes appear together //~^ ERROR malformed `coverage` attribute input
// with other errors, and they suggest using the incorrect `#[coverage]` syntax. //~| ERROR attribute should be applied to a function definition or closure
#[coverage = "off"] //~ ERROR malformed `coverage` attribute input
mod my_mod {} mod my_mod {}
mod my_mod_inner { mod my_mod_inner {
#![coverage = "off"] //~ ERROR malformed `coverage` attribute input #![coverage = "off"]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
} }
#[coverage = "off"] #[coverage = "off"]
//~^ ERROR `#[coverage]` must be applied to coverable code //~^ ERROR malformed `coverage` attribute input
//~| ERROR malformed `coverage` attribute input //~| ERROR attribute should be applied to a function definition or closure
struct MyStruct; struct MyStruct;
#[coverage = "off"] //~ ERROR malformed `coverage` attribute input #[coverage = "off"]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
impl MyStruct { impl MyStruct {
#[coverage = "off"] #[coverage = "off"]
//~^ ERROR `#[coverage]` must be applied to coverable code //~^ ERROR malformed `coverage` attribute input
//~| ERROR malformed `coverage` attribute input //~| ERROR attribute should be applied to a function definition or closure
const X: u32 = 7; const X: u32 = 7;
} }
#[coverage = "off"] //~ ERROR malformed `coverage` attribute input #[coverage = "off"]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
trait MyTrait { trait MyTrait {
#[coverage = "off"] #[coverage = "off"]
//~^ ERROR `#[coverage]` must be applied to coverable code //~^ ERROR malformed `coverage` attribute input
//~| ERROR malformed `coverage` attribute input //~| ERROR attribute should be applied to a function definition or closure
const X: u32; const X: u32;
#[coverage = "off"] #[coverage = "off"]
//~^ ERROR `#[coverage]` must be applied to coverable code //~^ ERROR malformed `coverage` attribute input
//~| ERROR malformed `coverage` attribute input //~| ERROR attribute should be applied to a function definition or closure
type T; type T;
} }
#[coverage = "off"] //~ ERROR malformed `coverage` attribute input #[coverage = "off"]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
impl MyTrait for MyStruct { impl MyTrait for MyStruct {
#[coverage = "off"] #[coverage = "off"]
//~^ ERROR `#[coverage]` must be applied to coverable code //~^ ERROR malformed `coverage` attribute input
//~| ERROR malformed `coverage` attribute input //~| ERROR attribute should be applied to a function definition or closure
const X: u32 = 8; const X: u32 = 8;
#[coverage = "off"] #[coverage = "off"]
//~^ ERROR `#[coverage]` must be applied to coverable code //~^ ERROR malformed `coverage` attribute input
//~| ERROR malformed `coverage` attribute input //~| ERROR attribute should be applied to a function definition or closure
type T = (); type T = ();
} }
#[coverage = "off"] #[coverage = "off"]
//~^ ERROR expected `coverage(off)` or `coverage(on)` //~^ ERROR malformed `coverage` attribute input
//~| ERROR malformed `coverage` attribute input
fn main() {} fn main() {}

View File

@ -1,28 +1,28 @@
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/name-value.rs:15:1 --> $DIR/name-value.rs:11:1
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~~~~ |
LL | #[coverage] LL | #[coverage(on)]
| ~~~~~~~~~~~ |
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/name-value.rs:19:5 --> $DIR/name-value.rs:17:5
| |
LL | #![coverage = "off"] LL | #![coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #![coverage(on|off)] LL | #![coverage(off)]
| ~~~~~~~~~~~~~~~~~~~~ |
LL | #![coverage] LL | #![coverage(on)]
| ~~~~~~~~~~~~ |
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/name-value.rs:22:1 --> $DIR/name-value.rs:22:1
@ -32,22 +32,22 @@ LL | #[coverage = "off"]
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| |
LL | #[coverage] LL | #[coverage(on)]
| |
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/name-value.rs:29:5 --> $DIR/name-value.rs:31:5
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| |
LL | #[coverage] LL | #[coverage(on)]
| |
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
@ -58,162 +58,220 @@ LL | #[coverage = "off"]
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~~~~ |
LL | #[coverage] LL | #[coverage(on)]
| ~~~~~~~~~~~ |
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/name-value.rs:37:5 --> $DIR/name-value.rs:41:5
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| |
LL | #[coverage] LL | #[coverage(on)]
| |
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/name-value.rs:42:5 --> $DIR/name-value.rs:46:5
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| |
LL | #[coverage] LL | #[coverage(on)]
| |
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/name-value.rs:35:1 --> $DIR/name-value.rs:37:1
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~~~~ |
LL | #[coverage] LL | #[coverage(on)]
| ~~~~~~~~~~~ |
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/name-value.rs:50:5 --> $DIR/name-value.rs:56:5
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| |
LL | #[coverage] LL | #[coverage(on)]
| |
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/name-value.rs:55:5 --> $DIR/name-value.rs:61:5
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| |
LL | #[coverage] LL | #[coverage(on)]
| |
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/name-value.rs:48:1 --> $DIR/name-value.rs:52:1
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~~~~ |
LL | #[coverage] LL | #[coverage(on)]
| ~~~~~~~~~~~ |
error: malformed `coverage` attribute input error: malformed `coverage` attribute input
--> $DIR/name-value.rs:61:1 --> $DIR/name-value.rs:67:1
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
| |
help: the following are the possible correct uses help: the following are the possible correct uses
| |
LL | #[coverage(on|off)] LL | #[coverage(off)]
| |
LL | #[coverage] LL | #[coverage(on)]
| |
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/name-value.rs:11:1
|
LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^
...
LL | mod my_mod {}
| ------------- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/name-value.rs:17:5
|
LL | / mod my_mod_inner {
LL | | #![coverage = "off"]
| | ^^^^^^^^^^^^^^^^^^^^
LL | |
LL | |
LL | | }
| |_- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/name-value.rs:22:1 --> $DIR/name-value.rs:22:1
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
... ...
LL | struct MyStruct; LL | struct MyStruct;
| ---------------- not coverable code | ---------------- not a function or closure
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/name-value.rs:37:5 --> $DIR/name-value.rs:27:1
|
LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^
...
LL | / impl MyStruct {
LL | | #[coverage = "off"]
LL | |
LL | |
LL | | const X: u32 = 7;
LL | | }
| |_- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/name-value.rs:37:1
|
LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^
...
LL | / trait MyTrait {
LL | | #[coverage = "off"]
LL | |
LL | |
... |
LL | | type T;
LL | | }
| |_- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/name-value.rs:52:1
|
LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^
...
LL | / impl MyTrait for MyStruct {
LL | | #[coverage = "off"]
LL | |
LL | |
... |
LL | | type T = ();
LL | | }
| |_- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/name-value.rs:41:5
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
... ...
LL | const X: u32; LL | const X: u32;
| ------------- not coverable code | ------------- not a function or closure
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/name-value.rs:42:5 --> $DIR/name-value.rs:46:5
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
... ...
LL | type T; LL | type T;
| ------- not coverable code | ------- not a function or closure
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/name-value.rs:29:5 --> $DIR/name-value.rs:31:5
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
... ...
LL | const X: u32 = 7; LL | const X: u32 = 7;
| ----------------- not coverable code | ----------------- not a function or closure
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/name-value.rs:50:5 --> $DIR/name-value.rs:56:5
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
... ...
LL | const X: u32 = 8; LL | const X: u32 = 8;
| ----------------- not coverable code | ----------------- not a function or closure
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/name-value.rs:55:5 --> $DIR/name-value.rs:61:5
| |
LL | #[coverage = "off"] LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^
... ...
LL | type T = (); LL | type T = ();
| ------------ not coverable code | ------------ not a function or closure
error: expected `coverage(off)` or `coverage(on)` error: aborting due to 23 previous errors
--> $DIR/name-value.rs:61:1
|
LL | #[coverage = "off"]
| ^^^^^^^^^^^^^^^^^^^
error: aborting due to 19 previous errors
For more information about this error, try `rustc --explain E0788`. For more information about this error, try `rustc --explain E0788`.

View File

@ -2,54 +2,48 @@
#![feature(coverage_attribute)] #![feature(coverage_attribute)]
#![feature(impl_trait_in_assoc_type)] #![feature(impl_trait_in_assoc_type)]
#![warn(unused_attributes)] #![warn(unused_attributes)]
#![coverage(off)] #![coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
//~^ WARN: `#[coverage]` does not propagate into items and must be applied to the contained functions directly
#[coverage(off)] #[coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
//~^ WARN: `#[coverage]` does not propagate into items and must be applied to the contained functions directly
trait Trait { trait Trait {
#[coverage(off)] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
const X: u32; const X: u32;
#[coverage(off)] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
type T; type T;
type U; type U;
} }
#[coverage(off)] #[coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
//~^ WARN: `#[coverage]` does not propagate into items and must be applied to the contained functions directly
impl Trait for () { impl Trait for () {
const X: u32 = 0; const X: u32 = 0;
#[coverage(off)] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
type T = Self; type T = Self;
#[coverage(off)] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
type U = impl Trait; //~ ERROR unconstrained opaque type type U = impl Trait; //~ ERROR unconstrained opaque type
} }
extern "C" { extern "C" {
#[coverage(off)] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
static X: u32; static X: u32;
#[coverage(off)] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
type T; type T;
} }
#[coverage(off)] #[coverage(off)]
fn main() { fn main() {
#[coverage(off)] #[coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
//~^ WARN `#[coverage]` may only be applied to function definitions
let _ = (); let _ = ();
match () { match () {
#[coverage(off)] #[coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
//~^ WARN `#[coverage]` may only be applied to function definitions
() => (), () => (),
} }
#[coverage(off)] #[coverage(off)] //~ ERROR attribute should be applied to a function definition or closure
//~^ WARN `#[coverage]` may only be applied to function definitions
return (); return ();
} }

View File

@ -1,101 +1,116 @@
warning: `#[coverage]` does not propagate into items and must be applied to the contained functions directly error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:8:1 --> $DIR/no-coverage.rs:7:1
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
| LL | / trait Trait {
note: the lint level is defined here LL | | #[coverage(off)]
--> $DIR/no-coverage.rs:4:9 LL | | const X: u32;
| ... |
LL | #![warn(unused_attributes)] LL | | type U;
| ^^^^^^^^^^^^^^^^^ LL | | }
| |_- not a function or closure
warning: `#[coverage]` does not propagate into items and must be applied to the contained functions directly error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:20:1 --> $DIR/no-coverage.rs:18:1
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
LL | / impl Trait for () {
LL | | const X: u32 = 0;
LL | |
LL | | #[coverage(off)]
... |
LL | | type U = impl Trait;
LL | | }
| |_- not a function or closure
warning: `#[coverage]` may only be applied to function definitions error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:42:5 --> $DIR/no-coverage.rs:39:5
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
LL | let _ = ();
| ----------- not a function or closure
warning: `#[coverage]` may only be applied to function definitions error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:47:9 --> $DIR/no-coverage.rs:43:9
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
LL | () => (),
| -------- not a function or closure
warning: `#[coverage]` may only be applied to function definitions error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:52:5 --> $DIR/no-coverage.rs:47:5
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
LL | return ();
| --------- not a function or closure
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:11:5 --> $DIR/no-coverage.rs:9:5
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
LL | const X: u32; LL | const X: u32;
| ------------- not coverable code | ------------- not a function or closure
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:14:5 --> $DIR/no-coverage.rs:12:5
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
LL | type T; LL | type T;
| ------- not coverable code | ------- not a function or closure
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:25:5 --> $DIR/no-coverage.rs:22:5
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
LL | type T = Self; LL | type T = Self;
| -------------- not coverable code | -------------- not a function or closure
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:28:5 --> $DIR/no-coverage.rs:25:5
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
LL | type U = impl Trait; LL | type U = impl Trait;
| -------------------- not coverable code | -------------------- not a function or closure
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:33:5 --> $DIR/no-coverage.rs:30:5
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
LL | static X: u32; LL | static X: u32;
| -------------- not coverable code | -------------- not a function or closure
error[E0788]: `#[coverage]` must be applied to coverable code error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:36:5 --> $DIR/no-coverage.rs:33:5
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^
LL | type T; LL | type T;
| ------- not coverable code | ------- not a function or closure
warning: `#[coverage]` does not propagate into items and must be applied to the contained functions directly error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/no-coverage.rs:5:1 --> $DIR/no-coverage.rs:5:1
| |
LL | #![coverage(off)] LL | #![coverage(off)]
| ^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^ not a function or closure
error: unconstrained opaque type error: unconstrained opaque type
--> $DIR/no-coverage.rs:29:14 --> $DIR/no-coverage.rs:26:14
| |
LL | type U = impl Trait; LL | type U = impl Trait;
| ^^^^^^^^^^ | ^^^^^^^^^^
| |
= note: `U` must be used in combination with a concrete type within the same impl = note: `U` must be used in combination with a concrete type within the same impl
error: aborting due to 7 previous errors; 6 warnings emitted error: aborting due to 13 previous errors
For more information about this error, try `rustc --explain E0788`. For more information about this error, try `rustc --explain E0788`.

View File

@ -4,16 +4,16 @@
// Check that yes/no in `#[coverage(yes)]` and `#[coverage(no)]` must be bare // Check that yes/no in `#[coverage(yes)]` and `#[coverage(no)]` must be bare
// words, not part of a more complicated substructure. // words, not part of a more complicated substructure.
#[coverage(yes(milord))] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage(yes(milord))] //~ ERROR malformed `coverage` attribute input
fn yes_list() {} fn yes_list() {}
#[coverage(no(milord))] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage(no(milord))] //~ ERROR malformed `coverage` attribute input
fn no_list() {} fn no_list() {}
#[coverage(yes = "milord")] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage(yes = "milord")] //~ ERROR malformed `coverage` attribute input
fn yes_key() {} fn yes_key() {}
#[coverage(no = "milord")] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage(no = "milord")] //~ ERROR malformed `coverage` attribute input
fn no_key() {} fn no_key() {}
fn main() {} fn main() {}

View File

@ -1,26 +1,54 @@
error: expected `coverage(off)` or `coverage(on)` error: malformed `coverage` attribute input
--> $DIR/subword.rs:7:1 --> $DIR/subword.rs:7:1
| |
LL | #[coverage(yes(milord))] LL | #[coverage(yes(milord))]
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: expected `coverage(off)` or `coverage(on)` error: malformed `coverage` attribute input
--> $DIR/subword.rs:10:1 --> $DIR/subword.rs:10:1
| |
LL | #[coverage(no(milord))] LL | #[coverage(no(milord))]
| ^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: expected `coverage(off)` or `coverage(on)` error: malformed `coverage` attribute input
--> $DIR/subword.rs:13:1 --> $DIR/subword.rs:13:1
| |
LL | #[coverage(yes = "milord")] LL | #[coverage(yes = "milord")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: expected `coverage(off)` or `coverage(on)` error: malformed `coverage` attribute input
--> $DIR/subword.rs:16:1 --> $DIR/subword.rs:16:1
| |
LL | #[coverage(no = "milord")] LL | #[coverage(no = "milord")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
| ~~~~~~~~~~~~~~~~
LL | #[coverage(on)]
| ~~~~~~~~~~~~~~~
error: aborting due to 4 previous errors error: aborting due to 4 previous errors

View File

@ -8,47 +8,62 @@
// and in places that cannot have a coverage attribute, to demonstrate the // and in places that cannot have a coverage attribute, to demonstrate the
// interaction between multiple errors. // interaction between multiple errors.
// FIXME(#126658): The error messages for using this syntax give the impression
// that it is legal, even though it should never be legal.
// FIXME(#126658): This is silently allowed, but should not be.
#[coverage] #[coverage]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
mod my_mod {} mod my_mod {}
// FIXME(#126658): This is silently allowed, but should not be.
mod my_mod_inner { mod my_mod_inner {
#![coverage] #![coverage]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
} }
#[coverage] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
struct MyStruct; struct MyStruct;
// FIXME(#126658): This is silently allowed, but should not be.
#[coverage] #[coverage]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
impl MyStruct { impl MyStruct {
#[coverage] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
const X: u32 = 7; const X: u32 = 7;
} }
// FIXME(#126658): This is silently allowed, but should not be.
#[coverage] #[coverage]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
trait MyTrait { trait MyTrait {
#[coverage] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
const X: u32; const X: u32;
#[coverage] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
type T; type T;
} }
// FIXME(#126658): This is silently allowed, but should not be.
#[coverage] #[coverage]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
impl MyTrait for MyStruct { impl MyTrait for MyStruct {
#[coverage] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
const X: u32 = 8; const X: u32 = 8;
#[coverage] //~ ERROR `#[coverage]` must be applied to coverable code #[coverage]
//~^ ERROR malformed `coverage` attribute input
//~| ERROR attribute should be applied to a function definition or closure
type T = (); type T = ();
} }
#[coverage] //~ ERROR expected `coverage(off)` or `coverage(on)` #[coverage]
//~^ ERROR malformed `coverage` attribute input
fn main() {} fn main() {}

View File

@ -1,57 +1,277 @@
error[E0788]: `#[coverage]` must be applied to coverable code error: malformed `coverage` attribute input
--> $DIR/word-only.rs:23:1 --> $DIR/word-only.rs:11:1
| |
LL | #[coverage] LL | #[coverage]
| ^^^^^^^^^^^ | ^^^^^^^^^^^
LL | struct MyStruct; |
| ---------------- not coverable code help: the following are the possible correct uses
|
LL | #[coverage(off)]
|
LL | #[coverage(on)]
|
error[E0788]: `#[coverage]` must be applied to coverable code error: malformed `coverage` attribute input
--> $DIR/word-only.rs:36:5 --> $DIR/word-only.rs:17:5
|
LL | #![coverage]
| ^^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #![coverage(off)]
|
LL | #![coverage(on)]
|
error: malformed `coverage` attribute input
--> $DIR/word-only.rs:22:1
|
LL | #[coverage]
| ^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
|
LL | #[coverage(on)]
|
error: malformed `coverage` attribute input
--> $DIR/word-only.rs:31:5
| |
LL | #[coverage] LL | #[coverage]
| ^^^^^^^^^^^ | ^^^^^^^^^^^
LL | const X: u32; |
| ------------- not coverable code help: the following are the possible correct uses
|
LL | #[coverage(off)]
|
LL | #[coverage(on)]
|
error[E0788]: `#[coverage]` must be applied to coverable code error: malformed `coverage` attribute input
--> $DIR/word-only.rs:39:5 --> $DIR/word-only.rs:27:1
|
LL | #[coverage]
| ^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
|
LL | #[coverage(on)]
|
error: malformed `coverage` attribute input
--> $DIR/word-only.rs:41:5
| |
LL | #[coverage] LL | #[coverage]
| ^^^^^^^^^^^ | ^^^^^^^^^^^
LL | type T;
| ------- not coverable code
error[E0788]: `#[coverage]` must be applied to coverable code
--> $DIR/word-only.rs:29:5
| |
LL | #[coverage] help: the following are the possible correct uses
| ^^^^^^^^^^^ |
LL | const X: u32 = 7; LL | #[coverage(off)]
| ----------------- not coverable code |
LL | #[coverage(on)]
|
error[E0788]: `#[coverage]` must be applied to coverable code error: malformed `coverage` attribute input
--> $DIR/word-only.rs:46:5 --> $DIR/word-only.rs:46:5
| |
LL | #[coverage] LL | #[coverage]
| ^^^^^^^^^^^ | ^^^^^^^^^^^
LL | const X: u32 = 8;
| ----------------- not coverable code
error[E0788]: `#[coverage]` must be applied to coverable code
--> $DIR/word-only.rs:49:5
| |
LL | #[coverage] help: the following are the possible correct uses
| ^^^^^^^^^^^ |
LL | type T = (); LL | #[coverage(off)]
| ------------ not coverable code |
LL | #[coverage(on)]
|
error: expected `coverage(off)` or `coverage(on)` error: malformed `coverage` attribute input
--> $DIR/word-only.rs:53:1 --> $DIR/word-only.rs:37:1
| |
LL | #[coverage] LL | #[coverage]
| ^^^^^^^^^^^ | ^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
|
LL | #[coverage(on)]
|
error: aborting due to 7 previous errors error: malformed `coverage` attribute input
--> $DIR/word-only.rs:56:5
|
LL | #[coverage]
| ^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
|
LL | #[coverage(on)]
|
error: malformed `coverage` attribute input
--> $DIR/word-only.rs:61:5
|
LL | #[coverage]
| ^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
|
LL | #[coverage(on)]
|
error: malformed `coverage` attribute input
--> $DIR/word-only.rs:52:1
|
LL | #[coverage]
| ^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
|
LL | #[coverage(on)]
|
error: malformed `coverage` attribute input
--> $DIR/word-only.rs:67:1
|
LL | #[coverage]
| ^^^^^^^^^^^
|
help: the following are the possible correct uses
|
LL | #[coverage(off)]
|
LL | #[coverage(on)]
|
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/word-only.rs:11:1
|
LL | #[coverage]
| ^^^^^^^^^^^
...
LL | mod my_mod {}
| ------------- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/word-only.rs:17:5
|
LL | / mod my_mod_inner {
LL | | #![coverage]
| | ^^^^^^^^^^^^
LL | |
LL | |
LL | | }
| |_- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/word-only.rs:22:1
|
LL | #[coverage]
| ^^^^^^^^^^^
...
LL | struct MyStruct;
| ---------------- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/word-only.rs:27:1
|
LL | #[coverage]
| ^^^^^^^^^^^
...
LL | / impl MyStruct {
LL | | #[coverage]
LL | |
LL | |
LL | | const X: u32 = 7;
LL | | }
| |_- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/word-only.rs:37:1
|
LL | #[coverage]
| ^^^^^^^^^^^
...
LL | / trait MyTrait {
LL | | #[coverage]
LL | |
LL | |
... |
LL | | type T;
LL | | }
| |_- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/word-only.rs:52:1
|
LL | #[coverage]
| ^^^^^^^^^^^
...
LL | / impl MyTrait for MyStruct {
LL | | #[coverage]
LL | |
LL | |
... |
LL | | type T = ();
LL | | }
| |_- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/word-only.rs:41:5
|
LL | #[coverage]
| ^^^^^^^^^^^
...
LL | const X: u32;
| ------------- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/word-only.rs:46:5
|
LL | #[coverage]
| ^^^^^^^^^^^
...
LL | type T;
| ------- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/word-only.rs:31:5
|
LL | #[coverage]
| ^^^^^^^^^^^
...
LL | const X: u32 = 7;
| ----------------- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/word-only.rs:56:5
|
LL | #[coverage]
| ^^^^^^^^^^^
...
LL | const X: u32 = 8;
| ----------------- not a function or closure
error[E0788]: attribute should be applied to a function definition or closure
--> $DIR/word-only.rs:61:5
|
LL | #[coverage]
| ^^^^^^^^^^^
...
LL | type T = ();
| ------------ not a function or closure
error: aborting due to 23 previous errors
For more information about this error, try `rustc --explain E0788`. For more information about this error, try `rustc --explain E0788`.