// Test that the unboxed closure sugar can be used with an arbitrary // struct type and that it is equivalent to the same syntax using // angle brackets. This test covers only simple types and in // particular doesn't test bound regions. #![feature(unboxed_closures)] #![allow(dead_code)] trait Foo { type Output; fn dummy(&self, t: T, u: Self::Output); } trait Eq { } impl Eq for X { } fn eq>() { } fn test<'a,'b>() { // No errors expected: eq::< dyn Foo<(),Output=()>, dyn Foo() >(); eq::< dyn Foo<(isize,),Output=()>, dyn Foo(isize) >(); eq::< dyn Foo<(isize,usize),Output=()>, dyn Foo(isize,usize) >(); eq::< dyn Foo<(isize,usize),Output=usize>, dyn Foo(isize,usize) -> usize >(); eq::< dyn Foo<(&'a isize,&'b usize),Output=usize>, dyn Foo(&'a isize,&'b usize) -> usize >(); // Test that anonymous regions in `()` form are equivalent // to fresh bound regions, and that we can intermingle // named and anonymous as we choose: eq::< dyn for<'x,'y> Foo<(&'x isize,&'y usize),Output=usize>, dyn for<'x,'y> Foo(&'x isize,&'y usize) -> usize >(); eq::< dyn for<'x,'y> Foo<(&'x isize,&'y usize),Output=usize>, dyn for<'x> Foo(&'x isize,&usize) -> usize >(); eq::< dyn for<'x,'y> Foo<(&'x isize,&'y usize),Output=usize>, dyn for<'y> Foo(&isize,&'y usize) -> usize >(); eq::< dyn for<'x,'y> Foo<(&'x isize,&'y usize),Output=usize>, dyn Foo(&isize,&usize) -> usize >(); // lifetime elision eq::< dyn for<'x> Foo<(&'x isize,), Output=&'x isize>, dyn Foo(&isize) -> &isize >(); // Errors expected: eq::< dyn Foo<(),Output=()>, dyn Foo(char) >(); //~^ ERROR E0277 } fn main() { }