Use Predicate ConstraintCategory when normalizing
This commit is contained in:
parent
c75817b0a7
commit
aae37f8763
14 changed files with 172 additions and 15 deletions
40
src/test/ui/generic-associated-types/bugs/hrtb-implied-2.rs
Normal file
40
src/test/ui/generic-associated-types/bugs/hrtb-implied-2.rs
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
// check-fail
|
||||
// known-bug
|
||||
|
||||
// This gives us problems because `for<'a> I::Item<'a>: Debug` should mean "for
|
||||
// all 'a where I::Item<'a> is WF", but really means "for all 'a possible"
|
||||
|
||||
trait LendingIterator: Sized {
|
||||
type Item<'a>
|
||||
where
|
||||
Self: 'a;
|
||||
fn next(&mut self) -> Self::Item<'_>;
|
||||
}
|
||||
fn fails<I: LendingIterator, F>(iter: &mut I, f: F) -> bool
|
||||
where
|
||||
F: FnMut(I::Item<'_>),
|
||||
{
|
||||
let mut iter2 = Eat(iter, f);
|
||||
let _next = iter2.next();
|
||||
//~^ borrowed data escapes
|
||||
true
|
||||
}
|
||||
impl<I: LendingIterator> LendingIterator for &mut I {
|
||||
type Item<'a> = I::Item<'a> where Self:'a;
|
||||
fn next(&mut self) -> Self::Item<'_> {
|
||||
(**self).next()
|
||||
}
|
||||
}
|
||||
|
||||
struct Eat<I, F>(I, F);
|
||||
impl<I: LendingIterator, F> Iterator for Eat<I, F>
|
||||
where
|
||||
F: FnMut(I::Item<'_>),
|
||||
{
|
||||
type Item = ();
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
error[E0521]: borrowed data escapes outside of function
|
||||
--> $DIR/hrtb-implied-2.rs:18:17
|
||||
|
|
||||
LL | fn fails<I: LendingIterator, F>(iter: &mut I, f: F) -> bool
|
||||
| ---- - let's call the lifetime of this reference `'1`
|
||||
| |
|
||||
| `iter` is a reference that is only valid in the function body
|
||||
...
|
||||
LL | let _next = iter2.next();
|
||||
| ^^^^^^^^^^^^
|
||||
| |
|
||||
| `iter` escapes the function body here
|
||||
| argument requires that `'1` must outlive `'static`
|
||||
|
|
||||
= note: requirement occurs because of a mutable reference to `Eat<&mut I, F>`
|
||||
= note: mutable references are invariant over their type parameter
|
||||
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
|
||||
= note: due to current limitations in the borrow checker, this implies a `'static` lifetime
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0521`.
|
||||
23
src/test/ui/generic-associated-types/bugs/hrtb-implied-3.rs
Normal file
23
src/test/ui/generic-associated-types/bugs/hrtb-implied-3.rs
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
trait LendingIterator {
|
||||
type Item<'a>
|
||||
where
|
||||
Self: 'a;
|
||||
}
|
||||
|
||||
impl LendingIterator for &str {
|
||||
type Item<'a> = () where Self:'a;
|
||||
}
|
||||
|
||||
fn trivial_bound<I>(_: I)
|
||||
where
|
||||
I: LendingIterator,
|
||||
for<'a> I::Item<'a>: Sized,
|
||||
{
|
||||
}
|
||||
|
||||
fn fails(iter: &str) {
|
||||
trivial_bound(iter);
|
||||
//~^ borrowed data escapes
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
error[E0521]: borrowed data escapes outside of function
|
||||
--> $DIR/hrtb-implied-3.rs:19:5
|
||||
|
|
||||
LL | fn fails(iter: &str) {
|
||||
| ---- - let's call the lifetime of this reference `'1`
|
||||
| |
|
||||
| `iter` is a reference that is only valid in the function body
|
||||
LL | trivial_bound(iter);
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| `iter` escapes the function body here
|
||||
| argument requires that `'1` must outlive `'static`
|
||||
|
|
||||
note: due to current limitations in the borrow checker, this implies a `'static` lifetime
|
||||
--> $DIR/hrtb-implied-3.rs:14:26
|
||||
|
|
||||
LL | for<'a> I::Item<'a>: Sized,
|
||||
| ^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0521`.
|
||||
|
|
@ -11,6 +11,8 @@ LL | x.size_hint().0
|
|||
| |
|
||||
| `x` escapes the function body here
|
||||
| argument requires that `'1` must outlive `'static`
|
||||
|
|
||||
= note: due to current limitations in the borrow checker, this implies a `'static` lifetime
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,12 @@ LL | fn give_some<'a>() {
|
|||
| -- lifetime `'a` defined here
|
||||
LL | want_hrtb::<&'a u32>()
|
||||
| ^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static`
|
||||
|
|
||||
note: due to current limitations in the borrow checker, this implies a `'static` lifetime
|
||||
--> $DIR/hrtb-just-for-static.rs:9:15
|
||||
|
|
||||
LL | where T : for<'a> Foo<&'a isize>
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: implementation of `Foo` is not general enough
|
||||
--> $DIR/hrtb-just-for-static.rs:30:5
|
||||
|
|
|
|||
|
|
@ -46,6 +46,12 @@ LL | fn foo_hrtb_bar_not<'b, T>(mut t: T)
|
|||
...
|
||||
LL | foo_hrtb_bar_not(&mut t);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'b` must outlive `'static`
|
||||
|
|
||||
note: due to current limitations in the borrow checker, this implies a `'static` lifetime
|
||||
--> $DIR/hrtb-perfect-forwarding.rs:37:8
|
||||
|
|
||||
LL | T: for<'a> Foo<&'a isize> + Bar<&'b isize>,
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: implementation of `Bar` is not general enough
|
||||
--> $DIR/hrtb-perfect-forwarding.rs:43:5
|
||||
|
|
|
|||
|
|
@ -5,6 +5,12 @@ LL | fn bar<'a>() {
|
|||
| -- lifetime `'a` defined here
|
||||
LL | foo::<&'a i32>();
|
||||
| ^^^^^^^^^^^^^^ requires that `'a` must outlive `'static`
|
||||
|
|
||||
note: due to current limitations in the borrow checker, this implies a `'static` lifetime
|
||||
--> $DIR/issue-26217.rs:1:30
|
||||
|
|
||||
LL | fn foo<T>() where for<'a> T: 'a {}
|
||||
| ^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
|||
|
|
@ -11,6 +11,12 @@ LL | fn test2<'a>() {
|
|||
| -- lifetime `'a` defined here
|
||||
LL | outlives_forall::<Value<'a>>();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static`
|
||||
|
|
||||
note: due to current limitations in the borrow checker, this implies a `'static` lifetime
|
||||
--> $DIR/type-test-universe.rs:6:16
|
||||
|
|
||||
LL | for<'u> T: 'u,
|
||||
| ^^
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue