trait ATC<'a> { type Type: Sized; } trait WithDefault: for<'a> ATC<'a> { fn with_default Fn(>::Type)>(f: F); } fn call<'b, T: for<'a> ATC<'a>, F: for<'a> Fn(>::Type)>( f: F, x: >::Type, ) { f(x); } impl<'a> ATC<'a> for () { type Type = Self; } impl WithDefault for () { fn with_default Fn(>::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(|_| {}); }