Skip to content

Commit

Permalink
add tests for 107090
Browse files Browse the repository at this point in the history
  • Loading branch information
chenyukang committed Jan 18, 2023
1 parent 0368adb commit 81efdab
Show file tree
Hide file tree
Showing 2 changed files with 204 additions and 0 deletions.
31 changes: 31 additions & 0 deletions tests/ui/inference/issue-107090.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
use std::marker::PhantomData;
struct Foo<'a, 'b, T>(PhantomData<(&'a (), &'b (), T)>)
where
Foo<'short, 'out, T>: Convert<'a, 'b>;
//~^ ERROR mismatched types
//~^^ ERROR mismatched types
//~^^^ ERROR use of undeclared lifetime name
//~| ERROR use of undeclared lifetime name `'out`

trait Convert<'a, 'b>: Sized {
fn cast(&'a self) -> &'b Self;
}
impl<'long: 'short, 'short, T> Convert<'long, 'b> for Foo<'short, 'out, T> {
//~^ ERROR use of undeclared lifetime name
//~^^ ERROR use of undeclared lifetime name `'out`
//~| ERROR cannot infer an appropriate lifetime for lifetime parameter
fn cast(&'long self) -> &'short Foo<'short, 'out, T> {
//~^ ERROR use of undeclared lifetime name
//~| ERROR cannot infer an appropriate lifetime for lifetime parameter
self
}
}

fn badboi<'in_, 'out, T>(x: Foo<'in_, 'out, T>, sadness: &'in_ Foo<'short, 'out, T>) -> &'out T {
//~^ ERROR use of undeclared lifetime name
//~^^ ERROR incompatible lifetime on type
//~| ERROR `x` has lifetime `'in_` but it needs to satisfy a `'static` lifetime requirement
sadness.cast()
}

fn main() {}
173 changes: 173 additions & 0 deletions tests/ui/inference/issue-107090.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,173 @@
error[E0261]: use of undeclared lifetime name `'short`
--> $DIR/issue-107090.rs:4:9
|
LL | Foo<'short, 'out, T>: Convert<'a, 'b>;
| ^^^^^^ undeclared lifetime
|
= note: for more information on higher-ranked polymorphism, visit https://doc.rust-lang.org/nomicon/hrtb.html
help: consider making the bound lifetime-generic with a new `'short` lifetime
|
LL | for<'short> Foo<'short, 'out, T>: Convert<'a, 'b>;
| +++++++++++
help: consider introducing lifetime `'short` here
|
LL | struct Foo<'short, 'a, 'b, T>(PhantomData<(&'a (), &'b (), T)>)
| +++++++

error[E0261]: use of undeclared lifetime name `'out`
--> $DIR/issue-107090.rs:4:17
|
LL | Foo<'short, 'out, T>: Convert<'a, 'b>;
| ^^^^ undeclared lifetime
|
help: consider making the bound lifetime-generic with a new `'out` lifetime
|
LL | for<'out> Foo<'short, 'out, T>: Convert<'a, 'b>;
| +++++++++
help: consider introducing lifetime `'out` here
|
LL | struct Foo<'out, 'a, 'b, T>(PhantomData<(&'a (), &'b (), T)>)
| +++++

error[E0261]: use of undeclared lifetime name `'b`
--> $DIR/issue-107090.rs:13:47
|
LL | impl<'long: 'short, 'short, T> Convert<'long, 'b> for Foo<'short, 'out, T> {
| - ^^ undeclared lifetime
| |
| help: consider introducing lifetime `'b` here: `'b,`

error[E0261]: use of undeclared lifetime name `'out`
--> $DIR/issue-107090.rs:13:67
|
LL | impl<'long: 'short, 'short, T> Convert<'long, 'b> for Foo<'short, 'out, T> {
| - help: consider introducing lifetime `'out` here: `'out,` ^^^^ undeclared lifetime

error[E0261]: use of undeclared lifetime name `'out`
--> $DIR/issue-107090.rs:17:49
|
LL | fn cast(&'long self) -> &'short Foo<'short, 'out, T> {
| ^^^^ undeclared lifetime
|
help: consider introducing lifetime `'out` here
|
LL | fn cast<'out>(&'long self) -> &'short Foo<'short, 'out, T> {
| ++++++
help: consider introducing lifetime `'out` here
|
LL | impl<'out, 'long: 'short, 'short, T> Convert<'long, 'b> for Foo<'short, 'out, T> {
| +++++

error[E0261]: use of undeclared lifetime name `'short`
--> $DIR/issue-107090.rs:24:68
|
LL | fn badboi<'in_, 'out, T>(x: Foo<'in_, 'out, T>, sadness: &'in_ Foo<'short, 'out, T>) -> &'out T {
| - ^^^^^^ undeclared lifetime
| |
| help: consider introducing lifetime `'short` here: `'short,`

error[E0308]: mismatched types
--> $DIR/issue-107090.rs:4:27
|
LL | Foo<'short, 'out, T>: Convert<'a, 'b>;
| ^^^^^^^^^^^^^^^ lifetime mismatch
|
= note: expected trait `Convert<'static, 'static>`
found trait `Convert<'a, 'b>`
note: the lifetime `'a` as defined here...
--> $DIR/issue-107090.rs:2:12
|
LL | struct Foo<'a, 'b, T>(PhantomData<(&'a (), &'b (), T)>)
| ^^
= note: ...does not necessarily outlive the static lifetime

error[E0308]: mismatched types
--> $DIR/issue-107090.rs:4:27
|
LL | Foo<'short, 'out, T>: Convert<'a, 'b>;
| ^^^^^^^^^^^^^^^ lifetime mismatch
|
= note: expected trait `Convert<'static, 'static>`
found trait `Convert<'a, 'b>`
note: the lifetime `'b` as defined here...
--> $DIR/issue-107090.rs:2:16
|
LL | struct Foo<'a, 'b, T>(PhantomData<(&'a (), &'b (), T)>)
| ^^
= note: ...does not necessarily outlive the static lifetime

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'long` due to conflicting requirements
--> $DIR/issue-107090.rs:13:55
|
LL | impl<'long: 'short, 'short, T> Convert<'long, 'b> for Foo<'short, 'out, T> {
| ^^^^^^^^^^^^^^^^^^^^
|
note: first, the lifetime cannot outlive the lifetime `'short` as defined here...
--> $DIR/issue-107090.rs:13:21
|
LL | impl<'long: 'short, 'short, T> Convert<'long, 'b> for Foo<'short, 'out, T> {
| ^^^^^^
= note: ...but the lifetime must also be valid for the static lifetime...
note: ...so that the types are compatible
--> $DIR/issue-107090.rs:13:55
|
LL | impl<'long: 'short, 'short, T> Convert<'long, 'b> for Foo<'short, 'out, T> {
| ^^^^^^^^^^^^^^^^^^^^
= note: expected `Convert<'short, 'static>`
found `Convert<'_, 'static>`

error: incompatible lifetime on type
--> $DIR/issue-107090.rs:24:29
|
LL | fn badboi<'in_, 'out, T>(x: Foo<'in_, 'out, T>, sadness: &'in_ Foo<'short, 'out, T>) -> &'out T {
| ^^^^^^^^^^^^^^^^^^
|
note: because this has an unmet lifetime requirement
--> $DIR/issue-107090.rs:4:27
|
LL | Foo<'short, 'out, T>: Convert<'a, 'b>;
| ^^^^^^^^^^^^^^^ introduces a `'static` lifetime requirement
note: the lifetime `'out` as defined here...
--> $DIR/issue-107090.rs:24:17
|
LL | fn badboi<'in_, 'out, T>(x: Foo<'in_, 'out, T>, sadness: &'in_ Foo<'short, 'out, T>) -> &'out T {
| ^^^^
note: ...does not necessarily outlive the static lifetime introduced by the compatible `impl`
--> $DIR/issue-107090.rs:13:1
|
LL | impl<'long: 'short, 'short, T> Convert<'long, 'b> for Foo<'short, 'out, T> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0759]: `x` has lifetime `'in_` but it needs to satisfy a `'static` lifetime requirement
--> $DIR/issue-107090.rs:24:29
|
LL | fn badboi<'in_, 'out, T>(x: Foo<'in_, 'out, T>, sadness: &'in_ Foo<'short, 'out, T>) -> &'out T {
| ^^^^^^^^^^^^^^^^^^
| |
| this data with lifetime `'in_`...
| ...is used and required to live as long as `'static` here

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'long` due to conflicting requirements
--> $DIR/issue-107090.rs:17:13
|
LL | fn cast(&'long self) -> &'short Foo<'short, 'out, T> {
| ^^^^^^^^^^^
|
note: first, the lifetime cannot outlive the lifetime `'short` as defined here...
--> $DIR/issue-107090.rs:13:21
|
LL | impl<'long: 'short, 'short, T> Convert<'long, 'b> for Foo<'short, 'out, T> {
| ^^^^^^
= note: ...but the lifetime must also be valid for the static lifetime...
note: ...so that the types are compatible
--> $DIR/issue-107090.rs:17:13
|
LL | fn cast(&'long self) -> &'short Foo<'short, 'out, T> {
| ^^^^^^^^^^^
= note: expected `Convert<'short, 'static>`
found `Convert<'_, 'static>`

error: aborting due to 12 previous errors

Some errors have detailed explanations: E0261, E0308, E0495, E0759.
For more information about an error, try `rustc --explain E0261`.

0 comments on commit 81efdab

Please sign in to comment.