Auto merge of #88640 - SkiFire13:tests-for-85499, r=jackh726

Add tests for issues fixed by #85499

Closes #80706
Closes #80956
Closes #81809
Closes #85455
This commit is contained in:
bors 2021-09-06 03:00:48 +00:00
commit 0e0ce8364c
5 changed files with 144 additions and 0 deletions

View File

@ -0,0 +1,70 @@
// check-pass
// edition:2018
type BoxFuture<T> = std::pin::Pin<Box<dyn std::future::Future<Output=T>>>;
fn main() {
f();
}
async fn f() {
run("dependency").await;
}
struct InMemoryStorage;
struct User<'dep> {
dep: &'dep str,
}
impl<'a> StorageRequest<InMemoryStorage> for SaveUser<'a> {
fn execute(&self) -> BoxFuture<Result<(), String>> {
todo!()
}
}
trait Storage {
type Error;
}
impl Storage for InMemoryStorage {
type Error = String;
}
trait StorageRequestReturnType {
type Output;
}
trait StorageRequest<S: Storage>: StorageRequestReturnType {
fn execute(
&self,
) -> BoxFuture<Result<<Self as StorageRequestReturnType>::Output, <S as Storage>::Error>>;
}
struct SaveUser<'a> {
name: &'a str,
}
impl<'a> StorageRequestReturnType for SaveUser<'a> {
type Output = ();
}
impl<'dep> User<'dep> {
async fn save<S>(self)
where
S: Storage,
for<'a> SaveUser<'a>: StorageRequest<S>,
{
SaveUser { name: "Joe" }
.execute()
.await;
}
}
async fn run<S>(dep: &str)
where
S: Storage,
for<'a> SaveUser<'a>: StorageRequest<S>,
{
User { dep }.save().await;
}

View File

@ -0,0 +1,21 @@
// check-pass
trait Bar {
type Type;
}
struct Foo<'a>(&'a ());
impl<'a> Bar for Foo<'a> {
type Type = ();
}
fn func<'a>(_: <Foo<'a> as Bar>::Type) {}
fn assert_is_func<A>(_: fn(A)) {}
fn test()
where
for<'a> <Foo<'a> as Bar>::Type: Sized,
{
assert_is_func(func);
}
fn main() {}

View File

@ -0,0 +1,21 @@
// check-pass
pub trait Indexable {
type Idx;
}
impl Indexable for u8 {
type Idx = u8;
}
impl Indexable for u16 {
type Idx = u16;
}
pub trait Indexer<T: Indexable>: std::ops::Index<T::Idx, Output = T> {}
trait StoreIndex: Indexer<u8> + Indexer<u16> {}
fn foo(st: &impl StoreIndex) -> &dyn StoreIndex {
st as &dyn StoreIndex
}
fn main() {}

View File

@ -0,0 +1,18 @@
#![feature(unboxed_closures)]
trait SomeTrait<'a> {
type Associated;
}
fn give_me_ice<T>() {
callee::<fn(&()) -> <T as SomeTrait<'_>>::Associated>();
//~^ ERROR: the trait bound `T: SomeTrait<'_>` is not satisfied
}
fn callee<T: Fn<(&'static (),)>>() {
println!("{}", std::any::type_name::<<T as FnOnce<(&'static (),)>>::Output>());
}
fn main() {
give_me_ice::<()>();
}

View File

@ -0,0 +1,14 @@
error[E0277]: the trait bound `T: SomeTrait<'_>` is not satisfied
--> $DIR/issue-85455.rs:8:5
|
LL | callee::<fn(&()) -> <T as SomeTrait<'_>>::Associated>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `SomeTrait<'_>` is not implemented for `T`
|
help: consider restricting type parameter `T`
|
LL | fn give_me_ice<T: SomeTrait<'_>>() {
| +++++++++++++++
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.