#![feature(type_alias_impl_trait)] type FooArg<'a> = &'a dyn ToString; type FooItem = Box FooRet>; #[repr(C)] struct Bar(u8); impl Iterator for Bar { type Item = FooItem; fn next(&mut self) -> Option { Some(Box::new(quux)) } } mod ret { pub type FooRet = impl std::fmt::Debug; pub fn quux(st: super::FooArg) -> FooRet { Some(st.to_string()) } } use ret::*; mod foo { pub type Foo = impl Iterator; pub fn ham() -> Foo { super::Bar(1) } pub fn oof(_: Foo) -> impl std::fmt::Debug { //~^ ERROR: item does not constrain `Foo::{opaque#0}`, but has it in its signature let mut bar = ham(); let func = bar.next().unwrap(); return func(&"oof"); } } use foo::*; fn main() { let _ = oof(ham()); }