//@ run-pass #![feature(specialization)] //~ WARN the feature `specialization` is incomplete trait Foo: std::fmt::Debug + Eq {} impl Foo for T {} fn hide(x: T) -> impl Foo { x } trait Leak: Sized { fn leak(self) -> T; } impl Leak for U { default fn leak(self) -> T { panic!("type mismatch") } } impl Leak for T { fn leak(self) -> T { self } } trait CheckIfSend: Sized { type T: Default; fn check(self) -> Self::T { Default::default() } } impl CheckIfSend for T { default type T = (); } impl CheckIfSend for T { type T = bool; } fn lucky_seven() -> impl Fn(usize) -> u8 { let a = [1, 2, 3, 4, 5, 6, 7]; move |i| a[i] } fn main() { assert_eq!(hide(42), hide(42)); assert_eq!(std::mem::size_of_val(&hide([0_u8; 5])), 5); assert_eq!(std::mem::size_of_val(&lucky_seven()), 7); assert_eq!(Leak::::leak(hide(5_i32)), 5_i32); assert_eq!(CheckIfSend::check(hide(0_i32)), false); }