-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Point to where clause for GATs to add bound #87478
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#![feature(generic_associated_types)] | ||
// check-fail | ||
|
||
trait StreamingIter { | ||
type Item<'a> where Self: 'a; | ||
fn next<'a>(&'a mut self) -> Option<Self::Item::<'a>>; | ||
} | ||
|
||
struct StreamingSliceIter<'a, T> { | ||
idx: usize, | ||
data: &'a mut [T], | ||
} | ||
|
||
impl<'b, T: 'b> StreamingIter for StreamingSliceIter<'b, T> { | ||
type Item<'a> = &'a mut T; | ||
//~^ the parameter type | ||
fn next(&mut self) -> Option<&mut T> { | ||
loop {} | ||
} | ||
} | ||
|
||
fn main() {} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
error[E0309]: the parameter type `T` may not live long enough | ||
--> $DIR/issue-84931.rs:15:21 | ||
| | ||
LL | type Item<'a> = &'a mut T; | ||
| - ^^^^^^^^^ ...so that the reference type `&'a mut T` does not outlive the data it points at | ||
| | | ||
| help: consider adding a where clause: `where T: 'a` | ||
|
||
error: aborting due to previous error | ||
|
||
For more information about this error, try `rustc --explain E0309`. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
#![feature(generic_associated_types)] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we mark the tests There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So...no. The suggestion here doesn't actually result in code that compiles, because it causes the where clauses not to match the trait's where clauses. (In fact, in this case, we can't write this where clause in the trait, we would have to use Unfortunately, that's a whole separate issue with GATs. But applying the current suggestion should help, in the future, to guide the user towards matching the trait's where clauses. |
||
// check-fail | ||
|
||
enum Either<L, R> { | ||
Left(L), | ||
Right(R), | ||
} | ||
|
||
pub trait HasChildrenOf { | ||
type T; | ||
type TRef<'a>; | ||
|
||
fn ref_children<'a>(&'a self) -> Vec<Self::TRef<'a>>; | ||
fn take_children(self) -> Vec<Self::T>; | ||
} | ||
|
||
impl<Left, Right> HasChildrenOf for Either<Left, Right> | ||
where | ||
Left: HasChildrenOf, | ||
Right: HasChildrenOf, | ||
{ | ||
type T = Either<Left::T, Right::T>; | ||
type TRef<'a> | ||
//~^ the associated type | ||
//~^^ the associated type | ||
where | ||
<Left as HasChildrenOf>::T: 'a, | ||
<Right as HasChildrenOf>::T: 'a | ||
= Either<&'a Left::T, &'a Right::T>; | ||
|
||
fn ref_children<'a>(&'a self) -> Vec<Self::TRef<'a>> { | ||
todo!() | ||
} | ||
|
||
fn take_children(self) -> Vec<Self::T> { | ||
todo!() | ||
} | ||
} | ||
|
||
fn main() {} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
error[E0309]: the associated type `<Left as HasChildrenOf>::T` may not live long enough | ||
--> $DIR/issue-86787.rs:23:5 | ||
| | ||
LL | / type TRef<'a> | ||
LL | | | ||
LL | | | ||
LL | | where | ||
LL | | <Left as HasChildrenOf>::T: 'a, | ||
LL | | <Right as HasChildrenOf>::T: 'a | ||
| | - help: consider adding a where clause: `, <Left as HasChildrenOf>::T: 'a` | ||
LL | | = Either<&'a Left::T, &'a Right::T>; | ||
| |________________________________________^ ...so that the type `<Left as HasChildrenOf>::T` will meet its required lifetime bounds | ||
|
||
error[E0309]: the associated type `<Right as HasChildrenOf>::T` may not live long enough | ||
--> $DIR/issue-86787.rs:23:5 | ||
| | ||
LL | / type TRef<'a> | ||
LL | | | ||
LL | | | ||
LL | | where | ||
LL | | <Left as HasChildrenOf>::T: 'a, | ||
LL | | <Right as HasChildrenOf>::T: 'a | ||
| | - help: consider adding a where clause: `, <Right as HasChildrenOf>::T: 'a` | ||
LL | | = Either<&'a Left::T, &'a Right::T>; | ||
| |________________________________________^ ...so that the type `<Right as HasChildrenOf>::T` will meet its required lifetime bounds | ||
|
||
error: aborting due to 2 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0309`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's make the suggestion a bit easier to read, given that it points at a span right in the middle of a larger span:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Although that would require rewording the other span label...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I leave it to your decision what to do here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So, now that the associated type points to the type itself, not the whole defintion, they don't overlap anymore.
I do think the verbose suggestion would be nice, but I'll leave that as a followup.