address review comments + better tests
This commit is contained in:
parent
83e653920d
commit
1eba6c404f
6 changed files with 415 additions and 108 deletions
137
src/test/ui/rust-2018/edition-lint-infer-outlives-macro.fixed
Normal file
137
src/test/ui/rust-2018/edition-lint-infer-outlives-macro.fixed
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
// edition:2018
|
||||
// aux-build:edition-lint-infer-outlives-macro.rs
|
||||
// run-rustfix
|
||||
|
||||
#![deny(explicit_outlives_requirements)]
|
||||
#![allow(dead_code)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate edition_lint_infer_outlives_macro;
|
||||
|
||||
// Test that the lint does not fire if the predicate is from the local crate,
|
||||
// but all the bounds are from an external macro.
|
||||
macro_rules! make_foo {
|
||||
($a:tt) => {
|
||||
struct Foo<$a, 'b: $a> {
|
||||
foo: &$a &'b (),
|
||||
}
|
||||
|
||||
struct FooWhere<$a, 'b> where 'b: $a {
|
||||
foo: &$a &'b (),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gimme_a! {make_foo!}
|
||||
|
||||
struct Bar<'a, 'b> {
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
bar: &'a &'b (),
|
||||
}
|
||||
|
||||
struct BarWhere<'a, 'b> {
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
bar: &'a &'b (),
|
||||
}
|
||||
|
||||
// Test that the lint *does* fire if the predicate is contained in a local macro.
|
||||
mod everything_inside {
|
||||
macro_rules! m {
|
||||
('b: 'a) => {
|
||||
struct Foo<'a, 'b>(&'a &'b ());
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Bar<'a, 'b>(&'a &'b ()) ;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Baz<'a, 'b>(&'a &'b ()) where (): Sized, ;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
};
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
mod inner_lifetime_outside_colon_inside {
|
||||
macro_rules! m {
|
||||
($b:lifetime: 'a) => {
|
||||
struct Foo<'a, $b>(&'a &$b ());
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Bar<'a, $b>(&'a &$b ()) ;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Baz<'a, $b>(&'a &$b ()) where (): Sized, ;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
mod outer_lifetime_outside_colon_inside {
|
||||
macro_rules! m {
|
||||
('b: $a:lifetime) => {
|
||||
struct Foo<$a, 'b: $a>(&$a &'b ());
|
||||
struct Bar<$a, 'b>(&$a &'b ()) where 'b: $a;
|
||||
struct Baz<$a, 'b>(&$a &'b ()) where (): Sized, 'b: $a;
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
mod both_lifetimes_outside_colon_inside {
|
||||
macro_rules! m {
|
||||
($b:lifetime: $a:lifetime) => {
|
||||
struct Foo<$a, $b: $a>(&$a &$b ());
|
||||
struct Bar<$a, $b>(&$a &$b ()) where $b: $a;
|
||||
struct Baz<$a, $b>(&$a &$b ()) where (): Sized, $b: $a;
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
mod everything_outside {
|
||||
macro_rules! m {
|
||||
($b:lifetime $colon:tt $a:lifetime) => {
|
||||
struct Foo<$a, $b $colon $a>(&$a &$b ());
|
||||
struct Bar<$a, $b>(&$a &$b ()) where $b $colon $a;
|
||||
struct Baz<$a, $b>(&$a &$b ()) where (): Sized, $b $colon $a;
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
mod everything_outside_with_tt_inner {
|
||||
macro_rules! m {
|
||||
($b:tt $colon:tt $a:lifetime) => {
|
||||
struct Foo<$a, $b $colon $a>(&$a &$b ());
|
||||
struct Bar<$a, $b>(&$a &$b ()) where $b $colon $a;
|
||||
struct Baz<$a, $b>(&$a &$b ()) where (): Sized, $b $colon $a;
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
// FIXME: These should be consistent.
|
||||
mod everything_outside_with_tt_outer {
|
||||
macro_rules! m {
|
||||
($b:lifetime $colon:tt $a:tt) => {
|
||||
struct Foo<$a, $b >(&$a &$b ());
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Bar<$a, $b>(&$a &$b ()) where $b $colon $a;
|
||||
struct Baz<$a, $b>(&$a &$b ()) where (): Sized, $b $colon $a;
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
mod everything_outside_with_tt_both {
|
||||
macro_rules! m {
|
||||
($b:tt $colon:tt $a:tt) => {
|
||||
struct Foo<$a, $b >(&$a &$b ());
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Bar<$a, $b>(&$a &$b ()) where ;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Baz<$a, $b>(&$a &$b ()) where (): Sized, ;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -1,25 +1,25 @@
|
|||
// edition:2018
|
||||
// aux-build:edition-lint-infer-outlives-macro.rs
|
||||
|
||||
// Test that the lint does not fire if the where predicate
|
||||
// is from the local crate, but all the bounds are from an
|
||||
// external macro.
|
||||
// run-rustfix
|
||||
|
||||
#![deny(explicit_outlives_requirements)]
|
||||
#![allow(dead_code)]
|
||||
|
||||
#[macro_use]
|
||||
extern crate edition_lint_infer_outlives_macro;
|
||||
|
||||
// Test that the lint does not fire if the predicate is from the local crate,
|
||||
// but all the bounds are from an external macro.
|
||||
macro_rules! make_foo {
|
||||
($a:tt) => {
|
||||
struct Foo<$a, 'b> where 'b: $a {
|
||||
struct Foo<$a, 'b: $a> {
|
||||
foo: &$a &'b (),
|
||||
}
|
||||
|
||||
struct Foo2<$a, 'b: $a> {
|
||||
struct FooWhere<$a, 'b> where 'b: $a {
|
||||
foo: &$a &'b (),
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
gimme_a! {make_foo!}
|
||||
|
|
@ -29,41 +29,109 @@ struct Bar<'a, 'b: 'a> {
|
|||
bar: &'a &'b (),
|
||||
}
|
||||
|
||||
macro_rules! make_quux {
|
||||
() => {
|
||||
struct Quux<'a, 'b> where 'b: 'a {
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
baz: &'a &'b (),
|
||||
}
|
||||
|
||||
struct Quux2<'a, 'b: 'a> {
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
baz: &'a &'b (),
|
||||
}
|
||||
};
|
||||
struct BarWhere<'a, 'b> where 'b: 'a {
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
bar: &'a &'b (),
|
||||
}
|
||||
|
||||
make_quux!{}
|
||||
|
||||
macro_rules! make_baz {
|
||||
() => {
|
||||
make_baz!{ 'a }
|
||||
};
|
||||
($a:lifetime) => {
|
||||
struct Baz<$a, 'b> where 'b: $a {
|
||||
baz: &$a &'b (),
|
||||
}
|
||||
|
||||
struct Baz2<$a, 'b: $a> {
|
||||
baz: &$a &'b (),
|
||||
}
|
||||
};
|
||||
// Test that the lint *does* fire if the predicate is contained in a local macro.
|
||||
mod everything_inside {
|
||||
macro_rules! m {
|
||||
('b: 'a) => {
|
||||
struct Foo<'a, 'b: 'a>(&'a &'b ());
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Bar<'a, 'b>(&'a &'b ()) where 'b: 'a;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Baz<'a, 'b>(&'a &'b ()) where (): Sized, 'b: 'a;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
};
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
make_baz!{ 'a }
|
||||
mod inner_lifetime_outside_colon_inside {
|
||||
macro_rules! m {
|
||||
($b:lifetime: 'a) => {
|
||||
struct Foo<'a, $b: 'a>(&'a &$b ());
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Bar<'a, $b>(&'a &$b ()) where $b: 'a;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Baz<'a, $b>(&'a &$b ()) where (): Sized, $b: 'a;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
mod baz {
|
||||
make_baz!{}
|
||||
mod outer_lifetime_outside_colon_inside {
|
||||
macro_rules! m {
|
||||
('b: $a:lifetime) => {
|
||||
struct Foo<$a, 'b: $a>(&$a &'b ());
|
||||
struct Bar<$a, 'b>(&$a &'b ()) where 'b: $a;
|
||||
struct Baz<$a, 'b>(&$a &'b ()) where (): Sized, 'b: $a;
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
mod both_lifetimes_outside_colon_inside {
|
||||
macro_rules! m {
|
||||
($b:lifetime: $a:lifetime) => {
|
||||
struct Foo<$a, $b: $a>(&$a &$b ());
|
||||
struct Bar<$a, $b>(&$a &$b ()) where $b: $a;
|
||||
struct Baz<$a, $b>(&$a &$b ()) where (): Sized, $b: $a;
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
mod everything_outside {
|
||||
macro_rules! m {
|
||||
($b:lifetime $colon:tt $a:lifetime) => {
|
||||
struct Foo<$a, $b $colon $a>(&$a &$b ());
|
||||
struct Bar<$a, $b>(&$a &$b ()) where $b $colon $a;
|
||||
struct Baz<$a, $b>(&$a &$b ()) where (): Sized, $b $colon $a;
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
mod everything_outside_with_tt_inner {
|
||||
macro_rules! m {
|
||||
($b:tt $colon:tt $a:lifetime) => {
|
||||
struct Foo<$a, $b $colon $a>(&$a &$b ());
|
||||
struct Bar<$a, $b>(&$a &$b ()) where $b $colon $a;
|
||||
struct Baz<$a, $b>(&$a &$b ()) where (): Sized, $b $colon $a;
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
// FIXME: These should be consistent.
|
||||
mod everything_outside_with_tt_outer {
|
||||
macro_rules! m {
|
||||
($b:lifetime $colon:tt $a:tt) => {
|
||||
struct Foo<$a, $b $colon $a>(&$a &$b ());
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Bar<$a, $b>(&$a &$b ()) where $b $colon $a;
|
||||
struct Baz<$a, $b>(&$a &$b ()) where (): Sized, $b $colon $a;
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
mod everything_outside_with_tt_both {
|
||||
macro_rules! m {
|
||||
($b:tt $colon:tt $a:tt) => {
|
||||
struct Foo<$a, $b $colon $a>(&$a &$b ());
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Bar<$a, $b>(&$a &$b ()) where $b $colon $a;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
struct Baz<$a, $b>(&$a &$b ()) where (): Sized, $b $colon $a;
|
||||
//~^ ERROR: outlives requirements can be inferred
|
||||
}
|
||||
}
|
||||
m!('b: 'a);
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
|
|||
|
|
@ -5,32 +5,106 @@ LL | struct Bar<'a, 'b: 'a> {
|
|||
| ^^^^ help: remove this bound
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:8:9
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:5:9
|
||||
|
|
||||
LL | #![deny(explicit_outlives_requirements)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: outlives requirements can be inferred
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:34:28
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:32:24
|
||||
|
|
||||
LL | struct Quux<'a, 'b> where 'b: 'a {
|
||||
| ^^^^^^^^^^^^^ help: remove this bound
|
||||
...
|
||||
LL | make_quux!{}
|
||||
| ------------ in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `make_quux` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
LL | struct BarWhere<'a, 'b> where 'b: 'a {
|
||||
| ^^^^^^^^^^^^^ help: remove this bound
|
||||
|
||||
error: outlives requirements can be inferred
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:39:28
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:41:30
|
||||
|
|
||||
LL | struct Quux2<'a, 'b: 'a> {
|
||||
| ^^^^ help: remove this bound
|
||||
LL | struct Foo<'a, 'b: 'a>(&'a &'b ());
|
||||
| ^^^^ help: remove this bound
|
||||
...
|
||||
LL | make_quux!{}
|
||||
| ------------ in this macro invocation
|
||||
LL | m!('b: 'a);
|
||||
| ---------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `make_quux` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
error: outlives requirements can be inferred
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:43:44
|
||||
|
|
||||
LL | struct Bar<'a, 'b>(&'a &'b ()) where 'b: 'a;
|
||||
| ^^^^^^^^^^^^ help: remove this bound
|
||||
...
|
||||
LL | m!('b: 'a);
|
||||
| ---------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: outlives requirements can be inferred
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:45:61
|
||||
|
|
||||
LL | struct Baz<'a, 'b>(&'a &'b ()) where (): Sized, 'b: 'a;
|
||||
| ^^^^^^ help: remove this bound
|
||||
...
|
||||
LL | m!('b: 'a);
|
||||
| ---------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: outlives requirements can be inferred
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:55:30
|
||||
|
|
||||
LL | struct Foo<'a, $b: 'a>(&'a &$b ());
|
||||
| ^^^^ help: remove this bound
|
||||
...
|
||||
LL | m!('b: 'a);
|
||||
| ---------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: outlives requirements can be inferred
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:57:44
|
||||
|
|
||||
LL | struct Bar<'a, $b>(&'a &$b ()) where $b: 'a;
|
||||
| ^^^^^^^^^^^^ help: remove this bound
|
||||
...
|
||||
LL | m!('b: 'a);
|
||||
| ---------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: outlives requirements can be inferred
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:59:61
|
||||
|
|
||||
LL | struct Baz<'a, $b>(&'a &$b ()) where (): Sized, $b: 'a;
|
||||
| ^^^^^^ help: remove this bound
|
||||
...
|
||||
LL | m!('b: 'a);
|
||||
| ---------- in this macro invocation
|
||||
|
|
||||
= note: this error originates in the macro `m` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: outlives requirements can be inferred
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:114:31
|
||||
|
|
||||
LL | struct Foo<$a, $b $colon $a>(&$a &$b ());
|
||||
| ^^^^^^^^^ help: remove this bound
|
||||
|
||||
error: outlives requirements can be inferred
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:126:31
|
||||
|
|
||||
LL | struct Foo<$a, $b $colon $a>(&$a &$b ());
|
||||
| ^^^^^^^^^ help: remove this bound
|
||||
|
||||
error: outlives requirements can be inferred
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:128:50
|
||||
|
|
||||
LL | struct Bar<$a, $b>(&$a &$b ()) where $b $colon $a;
|
||||
| ^^^^^^^^^^^^ help: remove this bound
|
||||
|
||||
error: outlives requirements can be inferred
|
||||
--> $DIR/edition-lint-infer-outlives-macro.rs:130:61
|
||||
|
|
||||
LL | struct Baz<$a, $b>(&$a &$b ()) where (): Sized, $b $colon $a;
|
||||
| ^^^^^^^^^^^^ help: remove this bound
|
||||
|
||||
error: aborting due to 12 previous errors
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue