Skip to content

Commit 0e0ce83

Browse files
committed
Auto merge of rust-lang#88640 - SkiFire13:tests-for-85499, r=jackh726
Add tests for issues fixed by rust-lang#85499 Closes rust-lang#80706 Closes rust-lang#80956 Closes rust-lang#81809 Closes rust-lang#85455
2 parents 8f3aa5e + b32a22e commit 0e0ce83

File tree

5 files changed

+144
-0
lines changed

5 files changed

+144
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// check-pass
2+
// edition:2018
3+
4+
type BoxFuture<T> = std::pin::Pin<Box<dyn std::future::Future<Output=T>>>;
5+
6+
fn main() {
7+
f();
8+
}
9+
10+
async fn f() {
11+
run("dependency").await;
12+
}
13+
14+
struct InMemoryStorage;
15+
16+
struct User<'dep> {
17+
dep: &'dep str,
18+
}
19+
20+
impl<'a> StorageRequest<InMemoryStorage> for SaveUser<'a> {
21+
fn execute(&self) -> BoxFuture<Result<(), String>> {
22+
todo!()
23+
}
24+
}
25+
26+
trait Storage {
27+
type Error;
28+
}
29+
30+
impl Storage for InMemoryStorage {
31+
type Error = String;
32+
}
33+
34+
trait StorageRequestReturnType {
35+
type Output;
36+
}
37+
38+
trait StorageRequest<S: Storage>: StorageRequestReturnType {
39+
fn execute(
40+
&self,
41+
) -> BoxFuture<Result<<Self as StorageRequestReturnType>::Output, <S as Storage>::Error>>;
42+
}
43+
44+
struct SaveUser<'a> {
45+
name: &'a str,
46+
}
47+
48+
impl<'a> StorageRequestReturnType for SaveUser<'a> {
49+
type Output = ();
50+
}
51+
52+
impl<'dep> User<'dep> {
53+
async fn save<S>(self)
54+
where
55+
S: Storage,
56+
for<'a> SaveUser<'a>: StorageRequest<S>,
57+
{
58+
SaveUser { name: "Joe" }
59+
.execute()
60+
.await;
61+
}
62+
}
63+
64+
async fn run<S>(dep: &str)
65+
where
66+
S: Storage,
67+
for<'a> SaveUser<'a>: StorageRequest<S>,
68+
{
69+
User { dep }.save().await;
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// check-pass
2+
3+
trait Bar {
4+
type Type;
5+
}
6+
struct Foo<'a>(&'a ());
7+
impl<'a> Bar for Foo<'a> {
8+
type Type = ();
9+
}
10+
11+
fn func<'a>(_: <Foo<'a> as Bar>::Type) {}
12+
fn assert_is_func<A>(_: fn(A)) {}
13+
14+
fn test()
15+
where
16+
for<'a> <Foo<'a> as Bar>::Type: Sized,
17+
{
18+
assert_is_func(func);
19+
}
20+
21+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// check-pass
2+
3+
pub trait Indexable {
4+
type Idx;
5+
}
6+
impl Indexable for u8 {
7+
type Idx = u8;
8+
}
9+
impl Indexable for u16 {
10+
type Idx = u16;
11+
}
12+
13+
pub trait Indexer<T: Indexable>: std::ops::Index<T::Idx, Output = T> {}
14+
15+
trait StoreIndex: Indexer<u8> + Indexer<u16> {}
16+
17+
fn foo(st: &impl StoreIndex) -> &dyn StoreIndex {
18+
st as &dyn StoreIndex
19+
}
20+
21+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#![feature(unboxed_closures)]
2+
3+
trait SomeTrait<'a> {
4+
type Associated;
5+
}
6+
7+
fn give_me_ice<T>() {
8+
callee::<fn(&()) -> <T as SomeTrait<'_>>::Associated>();
9+
//~^ ERROR: the trait bound `T: SomeTrait<'_>` is not satisfied
10+
}
11+
12+
fn callee<T: Fn<(&'static (),)>>() {
13+
println!("{}", std::any::type_name::<<T as FnOnce<(&'static (),)>>::Output>());
14+
}
15+
16+
fn main() {
17+
give_me_ice::<()>();
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
error[E0277]: the trait bound `T: SomeTrait<'_>` is not satisfied
2+
--> $DIR/issue-85455.rs:8:5
3+
|
4+
LL | callee::<fn(&()) -> <T as SomeTrait<'_>>::Associated>();
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `SomeTrait<'_>` is not implemented for `T`
6+
|
7+
help: consider restricting type parameter `T`
8+
|
9+
LL | fn give_me_ice<T: SomeTrait<'_>>() {
10+
| +++++++++++++++
11+
12+
error: aborting due to previous error
13+
14+
For more information about this error, try `rustc --explain E0277`.

0 commit comments

Comments
 (0)