mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 09:14:20 +00:00
Add some regression tests for #44454
Signed-off-by: Yuki Okushi <jtitor@2k36.org>
This commit is contained in:
parent
c6fcdb6906
commit
0f5f163a94
22
src/test/ui/traits/object/issue-44454-1.rs
Normal file
22
src/test/ui/traits/object/issue-44454-1.rs
Normal file
@ -0,0 +1,22 @@
|
||||
// Taken from https://github.com/rust-lang/rust/issues/44454#issue-256435333
|
||||
|
||||
trait Animal<X>: 'static {}
|
||||
|
||||
fn foo<Y, X>()
|
||||
where
|
||||
Y: Animal<X> + ?Sized,
|
||||
{
|
||||
// `Y` implements `Animal<X>` so `Y` is 'static.
|
||||
baz::<Y>()
|
||||
}
|
||||
|
||||
fn bar<'a>(_arg: &'a i32) {
|
||||
foo::<dyn Animal<&'a i32>, &'a i32>() //~ ERROR: lifetime may not live long enough
|
||||
}
|
||||
|
||||
fn baz<T: 'static + ?Sized>() {}
|
||||
|
||||
fn main() {
|
||||
let a = 5;
|
||||
bar(&a);
|
||||
}
|
10
src/test/ui/traits/object/issue-44454-1.stderr
Normal file
10
src/test/ui/traits/object/issue-44454-1.stderr
Normal file
@ -0,0 +1,10 @@
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/issue-44454-1.rs:14:5
|
||||
|
|
||||
LL | fn bar<'a>(_arg: &'a i32) {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | foo::<dyn Animal<&'a i32>, &'a i32>()
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
22
src/test/ui/traits/object/issue-44454-2.rs
Normal file
22
src/test/ui/traits/object/issue-44454-2.rs
Normal file
@ -0,0 +1,22 @@
|
||||
// Taken from https://github.com/rust-lang/rust/issues/44454#issuecomment-1175925928
|
||||
|
||||
trait Trait<ARG: 'static>: 'static {
|
||||
type Assoc: AsRef<str>;
|
||||
}
|
||||
|
||||
fn hr<T: ?Sized, ARG>(x: T::Assoc) -> Box<dyn AsRef<str> + 'static>
|
||||
where
|
||||
T: Trait<ARG>
|
||||
{
|
||||
Box::new(x)
|
||||
}
|
||||
|
||||
fn extend_lt<'a>(x: &'a str) -> Box<dyn AsRef<str> + 'static> {
|
||||
type DynTrait = dyn for<'a> Trait<&'a str, Assoc = &'a str>;
|
||||
hr::<DynTrait, _>(x) //~ ERROR: borrowed data escapes outside of function
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let extended = extend_lt(&String::from("hello"));
|
||||
println!("{}", extended.as_ref().as_ref());
|
||||
}
|
17
src/test/ui/traits/object/issue-44454-2.stderr
Normal file
17
src/test/ui/traits/object/issue-44454-2.stderr
Normal file
@ -0,0 +1,17 @@
|
||||
error[E0521]: borrowed data escapes outside of function
|
||||
--> $DIR/issue-44454-2.rs:16:5
|
||||
|
|
||||
LL | fn extend_lt<'a>(x: &'a str) -> Box<dyn AsRef<str> + 'static> {
|
||||
| -- - `x` is a reference that is only valid in the function body
|
||||
| |
|
||||
| lifetime `'a` defined here
|
||||
LL | type DynTrait = dyn for<'a> Trait<&'a str, Assoc = &'a str>;
|
||||
LL | hr::<DynTrait, _>(x)
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| `x` escapes the function body here
|
||||
| argument requires that `'a` must outlive `'static`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0521`.
|
33
src/test/ui/traits/object/issue-44454-3.rs
Normal file
33
src/test/ui/traits/object/issue-44454-3.rs
Normal file
@ -0,0 +1,33 @@
|
||||
// Taken from https://github.com/rust-lang/rust/issues/44454#issuecomment-1332781290
|
||||
|
||||
use std::any::Any;
|
||||
|
||||
trait Animal<X>: 'static {}
|
||||
|
||||
trait Projector {
|
||||
type Foo;
|
||||
}
|
||||
|
||||
impl<X> Projector for dyn Animal<X> {
|
||||
type Foo = X;
|
||||
}
|
||||
|
||||
fn make_static<'a, T>(t: &'a T) -> &'static T {
|
||||
let x: <dyn Animal<&'a T> as Projector>::Foo = t;
|
||||
let any = generic::<dyn Animal<&'a T>, &'a T>(x);
|
||||
//~^ ERROR: lifetime may not live long enough
|
||||
any.downcast_ref::<&'static T>().unwrap()
|
||||
}
|
||||
|
||||
fn generic<T: Projector + Animal<U> + ?Sized, U>(x: <T as Projector>::Foo) -> Box<dyn Any> {
|
||||
make_static_any(x)
|
||||
}
|
||||
|
||||
fn make_static_any<U: 'static>(u: U) -> Box<dyn Any> {
|
||||
Box::new(u)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let a = make_static(&"salut".to_string());
|
||||
println!("{}", *a);
|
||||
}
|
11
src/test/ui/traits/object/issue-44454-3.stderr
Normal file
11
src/test/ui/traits/object/issue-44454-3.stderr
Normal file
@ -0,0 +1,11 @@
|
||||
error: lifetime may not live long enough
|
||||
--> $DIR/issue-44454-3.rs:17:15
|
||||
|
|
||||
LL | fn make_static<'a, T>(t: &'a T) -> &'static T {
|
||||
| -- lifetime `'a` defined here
|
||||
LL | let x: <dyn Animal<&'a T> as Projector>::Foo = t;
|
||||
LL | let any = generic::<dyn Animal<&'a T>, &'a T>(x);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user