blob: e150ecfe9a0dc396c4ab8e1d302e2f06337587dc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
// check-pass
#![feature(generic_associated_types)]
use std::marker::PhantomData;
trait Family: Sized {
type Item<'a>;
fn apply_all<F>(&self, f: F)
where
F: FamilyItemFn<Self> { }
}
struct Array<T>(PhantomData<T>);
impl<T: 'static> Family for Array<T> {
type Item<'a> = &'a T;
}
trait FamilyItemFn<T: Family> {
fn apply(&self, item: T::Item<'_>);
}
impl<T, F> FamilyItemFn<T> for F
where
T: Family,
for<'a> F: Fn(T::Item<'a>)
{
fn apply(&self, item: T::Item<'_>) {
(*self)(item);
}
}
fn process<T: 'static>(array: Array<T>) {
// Works
array.apply_all(|x: &T| { });
// ICE: NoSolution
array.apply_all(|x: <Array<T> as Family>::Item<'_>| { });
}
fn main() {}
|