in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
#![allow(unused)]
|
|
|
|
#![deny(explicit_outlives_requirements)]
|
|
|
|
|
|
|
|
|
|
|
|
// These examples should live in edition-lint-infer-outlives.rs, but are split
|
|
|
|
// into this separate file because they can't be `rustfix`'d (and thus, can't
|
|
|
|
// be part of a `run-rustfix` test file) until rust-lang-nursery/rustfix#141
|
|
|
|
// is solved
|
|
|
|
|
2019-05-25 04:28:17 -05:00
|
|
|
mod structs {
|
|
|
|
use std::fmt::Debug;
|
|
|
|
|
|
|
|
struct TeeOutlivesAyIsDebugBee<'a, 'b, T: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T
|
|
|
|
}
|
|
|
|
|
|
|
|
struct TeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where T: 'a + Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T
|
|
|
|
}
|
|
|
|
|
|
|
|
struct TeeYooOutlivesAyIsDebugBee<'a, 'b, T, U: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: T,
|
|
|
|
yoo: &'a &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
struct TeeOutlivesAyYooBeeIsDebug<'a, 'b, T: 'a, U: 'b + Debug> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
struct TeeOutlivesAyYooIsDebugBee<'a, 'b, T: 'a, U: Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
struct TeeOutlivesAyYooWhereBee<'a, 'b, T: 'a, U> where U: 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
struct TeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U> where U: 'a + Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: T,
|
|
|
|
yoo: &'a &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
struct TeeOutlivesAyYooWhereBeeIsDebug<'a, 'b, T: 'a, U> where U: 'b + Debug {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
struct TeeOutlivesAyYooWhereIsDebugBee<'a, 'b, T: 'a, U> where U: Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
struct TeeWhereOutlivesAyYooWhereBeeIsDebug<'a, 'b, T, U> where T: 'a, U: 'b + Debug {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
struct TeeWhereOutlivesAyYooWhereIsDebugBee<'a, 'b, T, U> where T: 'a, U: Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
struct BeeOutlivesAyTeeBee<'a, 'b: 'a, T: 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T,
|
|
|
|
}
|
|
|
|
|
|
|
|
struct BeeOutlivesAyTeeAyBee<'a, 'b: 'a, T: 'a + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T,
|
|
|
|
}
|
|
|
|
|
|
|
|
struct BeeOutlivesAyTeeOutlivesAyIsDebugBee<'a, 'b: 'a, T: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T
|
|
|
|
}
|
|
|
|
|
|
|
|
struct BeeWhereAyTeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where 'b: 'a, T: 'a + Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T
|
|
|
|
}
|
|
|
|
|
|
|
|
struct BeeOutlivesAyTeeYooOutlivesAyIsDebugBee<'a, 'b: 'a, T, U: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: T,
|
|
|
|
yoo: &'a &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
struct BeeWhereAyTeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U>
|
|
|
|
where U: 'a + Debug + 'b, 'b: 'a
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
{
|
|
|
|
tee: T,
|
|
|
|
yoo: &'a &'b U
|
|
|
|
}
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
}
|
|
|
|
|
2019-05-25 04:28:17 -05:00
|
|
|
mod tuple_structs {
|
|
|
|
use std::fmt::Debug;
|
|
|
|
|
|
|
|
struct TeeOutlivesAyIsDebugBee<'a, 'b, T: 'a + Debug + 'b>(&'a &'b T);
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
2019-05-25 04:28:17 -05:00
|
|
|
struct TeeWhereOutlivesAyIsDebugBee<'a, 'b, T>(&'a &'b T) where T: 'a + Debug + 'b;
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
2019-05-25 04:28:17 -05:00
|
|
|
struct TeeYooOutlivesAyIsDebugBee<'a, 'b, T, U: 'a + Debug + 'b>(T, &'a &'b U);
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
2019-05-25 04:28:17 -05:00
|
|
|
struct TeeOutlivesAyYooBeeIsDebug<'a, 'b, T: 'a, U: 'b + Debug>(&'a T, &'b U);
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
2019-05-25 04:28:17 -05:00
|
|
|
struct TeeOutlivesAyYooIsDebugBee<'a, 'b, T: 'a, U: Debug + 'b>(&'a T, &'b U);
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
2019-05-25 04:28:17 -05:00
|
|
|
struct TeeOutlivesAyYooWhereBee<'a, 'b, T: 'a, U>(&'a T, &'b U) where U: 'b;
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
2019-05-25 04:28:17 -05:00
|
|
|
struct TeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U>(T, &'a &'b U) where U: 'a + Debug + 'b;
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
2019-05-25 04:28:17 -05:00
|
|
|
struct TeeOutlivesAyYooWhereBeeIsDebug<'a, 'b, T: 'a, U>(&'a T, &'b U) where U: 'b + Debug;
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
2019-05-25 04:28:17 -05:00
|
|
|
struct TeeOutlivesAyYooWhereIsDebugBee<'a, 'b, T: 'a, U>(&'a T, &'b U) where U: Debug + 'b;
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
|
|
|
struct TeeWhereAyYooWhereBeeIsDebug<'a, 'b, T, U>(&'a T, &'b U) where T: 'a, U: 'b + Debug;
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
|
|
|
struct TeeWhereAyYooWhereIsDebugBee<'a, 'b, T, U>(&'a T, &'b U) where T: 'a, U: Debug + 'b;
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
|
|
|
struct BeeOutlivesAyTeeBee<'a, 'b: 'a, T: 'b>(&'a &'b T);
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
|
|
|
struct BeeOutlivesAyTeeAyBee<'a, 'b: 'a, T: 'a + 'b>(&'a &'b T);
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
|
|
|
struct BeeOutlivesAyTeeOutlivesAyIsDebugBee<'a, 'b: 'a, T: 'a + Debug + 'b>(&'a &'b T);
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
|
|
|
struct BeeWhereAyTeeWhereAyIsDebugBee<'a, 'b, T>(&'a &'b T) where 'b: 'a, T: 'a + Debug + 'b;
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
|
2019-05-25 04:28:17 -05:00
|
|
|
struct BeeOutlivesAyTeeYooOutlivesAyIsDebugBee<'a, 'b: 'a, T, U: 'a + Debug + 'b>(T, &'a &'b U);
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
//~^ ERROR outlives requirements can be inferred
|
2019-05-25 04:28:17 -05:00
|
|
|
|
|
|
|
struct BeeWhereAyTeeYooWhereAyIsDebugBee<'a, 'b, T, U>(T, &'a &'b U)
|
|
|
|
where U: 'a + Debug + 'b, 'b: 'a;
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
}
|
|
|
|
|
|
|
|
mod enums {
|
|
|
|
use std::fmt::Debug;
|
|
|
|
|
|
|
|
enum TeeOutlivesAyIsDebugBee<'a, 'b, T: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: &'a &'b T },
|
|
|
|
}
|
|
|
|
|
|
|
|
enum TeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where T: 'a + Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V(&'a &'b T),
|
|
|
|
}
|
|
|
|
|
|
|
|
enum TeeYooOutlivesAyIsDebugBee<'a, 'b, T, U: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: T, },
|
|
|
|
W(&'a &'b U),
|
|
|
|
}
|
|
|
|
|
|
|
|
enum TeeOutlivesAyYooBeeIsDebug<'a, 'b, T: 'a, U: 'b + Debug> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: &'a T, yoo: &'b U },
|
|
|
|
W,
|
|
|
|
}
|
|
|
|
|
|
|
|
enum TeeOutlivesAyYooIsDebugBee<'a, 'b, T: 'a, U: Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V(&'a T, &'b U),
|
|
|
|
W,
|
|
|
|
}
|
|
|
|
|
|
|
|
enum TeeOutlivesAyYooWhereBee<'a, 'b, T: 'a, U> where U: 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: &'a T },
|
|
|
|
W(&'b U),
|
|
|
|
}
|
|
|
|
|
|
|
|
enum TeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U> where U: 'a + Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: T, yoo: &'a &'b U },
|
|
|
|
W,
|
|
|
|
}
|
|
|
|
|
|
|
|
enum TeeOutlivesAyYooWhereBeeIsDebug<'a, 'b, T: 'a, U> where U: 'b + Debug {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V(&'a T, &'b U),
|
|
|
|
W,
|
|
|
|
}
|
|
|
|
|
|
|
|
enum TeeOutlivesAyYooWhereIsDebugBee<'a, 'b, T: 'a, U> where U: Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: &'a T },
|
|
|
|
W(&'b U)
|
|
|
|
}
|
|
|
|
|
|
|
|
enum TeeWhereOutlivesAyYooWhereBeeIsDebug<'a, 'b, T, U> where T: 'a, U: 'b + Debug {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: &'a T, yoo: &'b U },
|
|
|
|
W,
|
|
|
|
}
|
|
|
|
|
|
|
|
enum TeeWhereOutlivesAyYooWhereIsDebugBee<'a, 'b, T, U> where T: 'a, U: Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V(&'a T, &'b U),
|
|
|
|
W,
|
|
|
|
}
|
|
|
|
|
|
|
|
enum BeeOutlivesAyTeeBee<'a, 'b: 'a, T: 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: &'a &'b T },
|
|
|
|
}
|
|
|
|
|
|
|
|
enum BeeOutlivesAyTeeAyBee<'a, 'b: 'a, T: 'a + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: &'a &'b T },
|
|
|
|
W,
|
|
|
|
}
|
|
|
|
|
|
|
|
enum BeeOutlivesAyTeeOutlivesAyIsDebugBee<'a, 'b: 'a, T: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: &'a &'b T },
|
|
|
|
}
|
|
|
|
|
|
|
|
enum BeeWhereAyTeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where 'b: 'a, T: 'a + Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V(&'a &'b T),
|
|
|
|
}
|
|
|
|
|
|
|
|
enum BeeOutlivesAyTeeYooOutlivesAyIsDebugBee<'a, 'b: 'a, T, U: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: T },
|
|
|
|
W(&'a &'b U),
|
|
|
|
}
|
|
|
|
|
|
|
|
enum BeeWhereAyTeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U> where U: 'a + Debug + 'b, 'b: 'a {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
V { tee: T, yoo: &'a &'b U },
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
mod unions {
|
|
|
|
use std::fmt::Debug;
|
|
|
|
|
|
|
|
union TeeOutlivesAyIsDebugBee<'a, 'b, T: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T
|
|
|
|
}
|
|
|
|
|
|
|
|
union TeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where T: 'a + Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T
|
|
|
|
}
|
|
|
|
|
|
|
|
union TeeYooOutlivesAyIsDebugBee<'a, 'b, T, U: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: *const T,
|
|
|
|
yoo: &'a &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
union TeeOutlivesAyYooBeeIsDebug<'a, 'b, T: 'a, U: 'b + Debug> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
union TeeOutlivesAyYooIsDebugBee<'a, 'b, T: 'a, U: Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
union TeeOutlivesAyYooWhereBee<'a, 'b, T: 'a, U> where U: 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
union TeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U> where U: 'a + Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: *const T,
|
|
|
|
yoo: &'a &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
union TeeOutlivesAyYooWhereBeeIsDebug<'a, 'b, T: 'a, U> where U: 'b + Debug {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
union TeeOutlivesAyYooWhereIsDebugBee<'a, 'b, T: 'a, U> where U: Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
union TeeWhereOutlivesAyYooWhereBeeIsDebug<'a, 'b, T, U> where T: 'a, U: 'b + Debug {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
union TeeWhereOutlivesAyYooWhereIsDebugBee<'a, 'b, T, U> where T: 'a, U: Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a T,
|
|
|
|
yoo: &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
union BeeOutlivesAyTeeBee<'a, 'b: 'a, T: 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T,
|
|
|
|
}
|
|
|
|
|
|
|
|
union BeeOutlivesAyTeeAyBee<'a, 'b: 'a, T: 'a + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T,
|
|
|
|
}
|
|
|
|
|
|
|
|
union BeeOutlivesAyTeeOutlivesAyIsDebugBee<'a, 'b: 'a, T: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T
|
|
|
|
}
|
|
|
|
|
|
|
|
union BeeWhereAyTeeWhereOutlivesAyIsDebugBee<'a, 'b, T> where 'b: 'a, T: 'a + Debug + 'b {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: &'a &'b T
|
|
|
|
}
|
|
|
|
|
|
|
|
union BeeOutlivesAyTeeYooOutlivesAyIsDebugBee<'a, 'b: 'a, T, U: 'a + Debug + 'b> {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: *const T,
|
|
|
|
yoo: &'a &'b U
|
|
|
|
}
|
|
|
|
|
|
|
|
union BeeWhereAyTeeYooWhereOutlivesAyIsDebugBee<'a, 'b, T, U> where U: 'a + Debug + 'b, 'b: 'a {
|
|
|
|
//~^ ERROR outlives requirements can be inferred
|
|
|
|
tee: *const T,
|
|
|
|
yoo: &'a &'b U
|
|
|
|
}
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
}
|
|
|
|
|
2023-01-15 14:01:00 -06:00
|
|
|
// https://github.com/rust-lang/rust/issues/106870
|
|
|
|
mod multiple_predicates_with_same_span {
|
|
|
|
macro_rules! m {
|
|
|
|
($($name:ident)+) => {
|
|
|
|
struct Inline<'a, $($name: 'a,)+>(&'a ($($name,)+));
|
|
|
|
//~^ ERROR: outlives requirements can be inferred
|
|
|
|
struct FullWhere<'a, $($name,)+>(&'a ($($name,)+)) where $($name: 'a,)+;
|
|
|
|
//~^ ERROR: outlives requirements can be inferred
|
|
|
|
struct PartialWhere<'a, $($name,)+>(&'a ($($name,)+)) where (): Sized, $($name: 'a,)+;
|
|
|
|
//~^ ERROR: outlives requirements can be inferred
|
|
|
|
struct Interleaved<'a, $($name,)+>(&'a ($($name,)+))
|
|
|
|
where
|
|
|
|
(): Sized,
|
|
|
|
$($name: 'a, $name: 'a, )+ //~ ERROR: outlives requirements can be inferred
|
|
|
|
$($name: 'a, $name: 'a, )+;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m!(T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15);
|
|
|
|
}
|
|
|
|
|
in which inferable outlives-requirements are linted
RFC 2093 (tracking issue #44493) lets us leave off
commonsensically inferable `T: 'a` outlives requirements. (A separate
feature-gate was split off for the case of 'static lifetimes, for
which questions still remain.) Detecting these was requested as an
idioms-2018 lint.
It turns out that issuing a correct, autofixable suggestion here is
somewhat subtle in the presence of other bounds and generic
parameters. Basically, we want to handle these three cases:
• One outlives-bound. We want to drop the bound altogether, including
the colon—
MyStruct<'a, T: 'a>
^^^^ help: remove this bound
• An outlives bound first, followed by a trait bound. We want to
delete the outlives bound and the following plus sign (and
hopefully get the whitespace right, too)—
MyStruct<'a, T: 'a + MyTrait>
^^^^^ help: remove this bound
• An outlives bound after a trait bound. We want to delete the
outlives lifetime and the preceding plus sign—
MyStruct<'a, T: MyTrait + 'a>
^^^^^ help: remove this bound
This gets (slightly) even more complicated in the case of where
clauses, where we want to drop the where clause altogether if there's
just the one bound. Hopefully the comments are enough to explain
what's going on!
A script (in Python, sorry) was used to generate the
hopefully-sufficiently-exhaustive UI test input. Some of these are
split off into a different file because rust-lang-nursery/rustfix#141
(and, causally upstream of that, #53934) prevents them from being
`run-rustfix`-tested.
We also make sure to include a UI test of a case (copied from RFC
2093) where the outlives-bound can't be inferred. Special thanks to
Niko Matsakis for pointing out the `inferred_outlives_of` query,
rather than blindly stripping outlives requirements as if we weren't a
production compiler and didn't care.
This concerns #52042.
2018-08-26 14:22:04 -05:00
|
|
|
fn main() {}
|