1 // Test interaction between unboxed closure sugar and default type
2 // parameters (should be exactly as if angle brackets were used).
3 
4 #![feature(unboxed_closures)]
5 #![allow(dead_code)]
6 
7 trait Foo<T,V=T> {
8     type Output;
dummy(&self, t: T, v: V)9     fn dummy(&self, t: T, v: V);
10 }
11 
same_types(&self, x: &X) -> bool12 trait Eq<X: ?Sized> { fn same_types(&self, x: &X) -> bool { true } }
13 impl<X: ?Sized> Eq<X> for X { }
eq<A: ?Sized,B: ?Sized>() where A : Eq<B>14 fn eq<A: ?Sized,B: ?Sized>() where A : Eq<B> { }
15 
test<'a,'b>()16 fn test<'a,'b>() {
17     // Parens are equivalent to omitting default in angle.
18     eq::<dyn Foo<(isize,), Output=()>, dyn Foo(isize)>();
19 
20     // In angle version, we supply something other than the default
21     eq::<dyn Foo<(isize,), isize, Output=()>, dyn Foo(isize)>();
22     //~^ ERROR E0277
23 
24     // Supply default explicitly.
25     eq::<dyn Foo<(isize,), (isize,), Output=()>, dyn Foo(isize)>();
26 }
27 
main()28 fn main() { }
29