#![feature(unboxed_closures)] trait A { fn a() where Self: Sized; } mod a { use crate::A; pub fn foo>() where F::Output: A { F::Output::a() } pub fn bar R, R: ?Sized>() {} pub fn baz>() where F::Output: A, F::Output: Sized { F::Output::a() } } mod b { use crate::A; pub fn foo>() where F::Output: A { F::Output::a() } pub fn bar R, R: ?Sized>() {} pub fn baz>() where F::Output: A, F::Output: Sized { F::Output::a() } } mod c { use crate::A; pub fn foo>() where F::Output: A { F::Output::a() } pub fn bar R, R: ?Sized>() {} pub fn baz>() where F::Output: A, F::Output: Sized { F::Output::a() } } impl A for Box { fn a() {} } fn main() { a::foo:: dyn A>(); //~ ERROR E0277 a::bar:: dyn A, _>(); //~ ERROR E0277 a::baz:: dyn A>(); //~ ERROR E0277 a::foo:: Box>(); // ok a::bar:: Box, _>(); // ok a::baz:: Box>(); // ok b::foo:: dyn A>(); //~ ERROR E0277 b::bar:: dyn A, _>(); //~ ERROR E0277 b::baz:: dyn A>(); //~ ERROR E0277 b::foo:: Box>(); // ok b::bar:: Box, _>(); // ok b::baz:: Box>(); // ok c::foo:: dyn A>(); //~ ERROR E0277 c::bar:: dyn A, _>(); //~ ERROR E0277 c::baz:: dyn A>(); //~ ERROR E0277 c::foo:: Box>(); // ok c::bar:: Box, _>(); // ok c::baz:: Box>(); // ok }