mirror of https://github.com/rust-lang/rust
33 lines
647 B
Rust
33 lines
647 B
Rust
trait ATC<'a> {
|
|
type Type: Sized;
|
|
}
|
|
|
|
trait WithDefault: for<'a> ATC<'a> {
|
|
fn with_default<F: for<'a> Fn(<Self as ATC<'a>>::Type)>(f: F);
|
|
}
|
|
|
|
fn call<'b, T: for<'a> ATC<'a>, F: for<'a> Fn(<T as ATC<'a>>::Type)>(
|
|
f: F,
|
|
x: <T as ATC<'b>>::Type,
|
|
) {
|
|
f(x);
|
|
}
|
|
|
|
impl<'a> ATC<'a> for () {
|
|
type Type = Self;
|
|
}
|
|
|
|
impl WithDefault for () {
|
|
fn with_default<F: for<'a> Fn(<Self as ATC<'a>>::Type)>(f: F) {
|
|
// Errors with a bogus type mismatch.
|
|
//f(());
|
|
// Going through another generic function works fine.
|
|
call(f, ());
|
|
//~^ expected a
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
// <()>::with_default(|_| {});
|
|
}
|