#![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)) } } pub type FooRet = impl std::fmt::Debug; #[define_opaque(FooRet)] pub fn quux(st: FooArg) -> FooRet { Some(st.to_string()) } pub type Foo = impl Iterator; #[define_opaque(Foo)] pub fn ham() -> Foo { //~^ ERROR: item does not constrain `FooRet::{opaque#0}` Bar(1) } #[define_opaque(Foo)] pub fn oof() -> impl std::fmt::Debug { //~^ ERROR: item does not constrain `FooRet::{opaque#0}` //~| ERROR: item does not constrain `Foo::{opaque#0}` let mut bar = ham(); let func = bar.next().unwrap(); return func(&"oof"); //~^ ERROR: opaque type's hidden type cannot be another opaque type } fn main() { let _ = oof(); }