Downgrade #[test] on macro call to warning

Follow up to #92959. Address #94508.
This commit is contained in:
Esteban Kuber 2022-03-04 20:34:10 +00:00
parent 32cbc7630b
commit 050d589991
3 changed files with 27 additions and 35 deletions

View File

@ -105,14 +105,18 @@ pub fn expand_test_or_bench(
// Note: non-associated fn items are already handled by `expand_test_or_bench` // Note: non-associated fn items are already handled by `expand_test_or_bench`
if !matches!(item.kind, ast::ItemKind::Fn(_)) { if !matches!(item.kind, ast::ItemKind::Fn(_)) {
cx.sess let diag = &cx.sess.parse_sess.span_diagnostic;
.parse_sess let msg = "the `#[test]` attribute may only be used on a non-associated function";
.span_diagnostic let mut err = match item.kind {
.struct_span_err( // These were a warning before #92959 and need to continue being that to avoid breaking
attr_sp, // stable user code (#94508).
"the `#[test]` attribute may only be used on a non-associated function", ast::ItemKind::MacCall(_) => diag.struct_span_warn(attr_sp, msg),
) // `.forget_guarantee()` needed to get these two arms to match types. Because of how
.note("the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions") // locally close the `.emit()` call is I'm comfortable with it, but if it can be
// reworked in the future to not need it, it'd be nice.
_ => diag.struct_span_err(attr_sp, msg).forget_guarantee(),
};
err.span_label(attr_sp, "the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions")
.span_label(item.span, format!("expected a non-associated function, found {} {}", item.kind.article(), item.kind.descr())) .span_label(item.span, format!("expected a non-associated function, found {} {}", item.kind.article(), item.kind.descr()))
.span_suggestion(attr_sp, "replace with conditional compilation to make the item only exist when tests are being run", String::from("#[cfg(test)]"), Applicability::MaybeIncorrect) .span_suggestion(attr_sp, "replace with conditional compilation to make the item only exist when tests are being run", String::from("#[cfg(test)]"), Applicability::MaybeIncorrect)
.emit(); .emit();

View File

@ -58,7 +58,7 @@ macro_rules! foo {
() => {}; () => {};
} }
#[test] //~ ERROR: the `#[test]` attribute may only be used on a non-associated function #[test] //~ WARN: the `#[test]` attribute may only be used on a non-associated function
foo!(); foo!();
// make sure it doesn't erroneously trigger on a real test // make sure it doesn't erroneously trigger on a real test

View File

@ -2,11 +2,10 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:3:1 --> $DIR/test-on-not-fn.rs:3:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | mod test {} LL | mod test {}
| ----------- expected a non-associated function, found a module | ----------- expected a non-associated function, found a module
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
@ -16,7 +15,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:6:1 --> $DIR/test-on-not-fn.rs:6:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | / mod loooooooooooooong_teeeeeeeeeest { LL | / mod loooooooooooooong_teeeeeeeeeest {
LL | | /* LL | | /*
LL | | this is a comment LL | | this is a comment
@ -26,7 +25,6 @@ LL | | */
LL | | } LL | | }
| |_- expected a non-associated function, found a module | |_- expected a non-associated function, found a module
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
@ -36,11 +34,10 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:20:1 --> $DIR/test-on-not-fn.rs:20:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | extern "C" {} LL | extern "C" {}
| ------------- expected a non-associated function, found an extern block | ------------- expected a non-associated function, found an extern block
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
@ -50,11 +47,10 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:23:1 --> $DIR/test-on-not-fn.rs:23:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | trait Foo {} LL | trait Foo {}
| ------------ expected a non-associated function, found a trait | ------------ expected a non-associated function, found a trait
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
@ -64,11 +60,10 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:26:1 --> $DIR/test-on-not-fn.rs:26:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | impl Foo for i32 {} LL | impl Foo for i32 {}
| ------------------- expected a non-associated function, found an implementation | ------------------- expected a non-associated function, found an implementation
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
@ -78,11 +73,10 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:29:1 --> $DIR/test-on-not-fn.rs:29:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | const FOO: i32 = -1_i32; LL | const FOO: i32 = -1_i32;
| ------------------------ expected a non-associated function, found a constant item | ------------------------ expected a non-associated function, found a constant item
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
@ -92,11 +86,10 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:32:1 --> $DIR/test-on-not-fn.rs:32:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | static BAR: u64 = 10_000_u64; LL | static BAR: u64 = 10_000_u64;
| ----------------------------- expected a non-associated function, found a static item | ----------------------------- expected a non-associated function, found a static item
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
@ -106,13 +99,12 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:35:1 --> $DIR/test-on-not-fn.rs:35:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | / enum MyUnit { LL | / enum MyUnit {
LL | | Unit, LL | | Unit,
LL | | } LL | | }
| |_- expected a non-associated function, found an enum | |_- expected a non-associated function, found an enum
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
@ -122,11 +114,10 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:40:1 --> $DIR/test-on-not-fn.rs:40:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | struct NewI32(i32); LL | struct NewI32(i32);
| ------------------- expected a non-associated function, found a struct | ------------------- expected a non-associated function, found a struct
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
@ -136,14 +127,13 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:43:1 --> $DIR/test-on-not-fn.rs:43:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | / union Spooky { LL | / union Spooky {
LL | | x: i32, LL | | x: i32,
LL | | y: u32, LL | | y: u32,
LL | | } LL | | }
| |_- expected a non-associated function, found a union | |_- expected a non-associated function, found a union
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
@ -153,7 +143,7 @@ error: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:50:1 --> $DIR/test-on-not-fn.rs:50:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | #[derive(Copy, Clone, Debug)] LL | #[derive(Copy, Clone, Debug)]
LL | / struct MoreAttrs { LL | / struct MoreAttrs {
LL | | a: i32, LL | | a: i32,
@ -161,25 +151,23 @@ LL | | b: u64,
LL | | } LL | | }
| |_- expected a non-associated function, found a struct | |_- expected a non-associated function, found a struct
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
| ~~~~~~~~~~~~ | ~~~~~~~~~~~~
error: the `#[test]` attribute may only be used on a non-associated function warning: the `#[test]` attribute may only be used on a non-associated function
--> $DIR/test-on-not-fn.rs:61:1 --> $DIR/test-on-not-fn.rs:61:1
| |
LL | #[test] LL | #[test]
| ^^^^^^^ | ^^^^^^^ the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
LL | foo!(); LL | foo!();
| ------- expected a non-associated function, found an item macro invocation | ------- expected a non-associated function, found an item macro invocation
| |
= note: the `#[test]` macro causes a a function to be run on a test and has no effect on non-functions
help: replace with conditional compilation to make the item only exist when tests are being run help: replace with conditional compilation to make the item only exist when tests are being run
| |
LL | #[cfg(test)] LL | #[cfg(test)]
| ~~~~~~~~~~~~ | ~~~~~~~~~~~~
error: aborting due to 12 previous errors error: aborting due to 11 previous errors; 1 warning emitted