error[E0308]: mismatched types --> $DIR/issue-70877.rs:16:9 | LL | type FooRet = impl std::fmt::Debug; | -------------------- the expected opaque type ... LL | fn next(&mut self) -> Option { | ------------------ expected `Option Fn(&'r (dyn ToString + 'r)) -> FooRet + 'static)>>` because of return type LL | Some(Box::new(quux)) | ^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn Fn`, found fn item | = note: expected enum `Option Fn(&'r (dyn ToString + 'r)) -> FooRet + 'static)>>` found enum `Option fn(&'r (dyn ToString + 'r)) -> FooRet {quux}>>` error: opaque type's hidden type cannot be another opaque type from the same scope --> $DIR/issue-70877.rs:31:12 | LL | return func(&"oof"); | ^^^^^^^^^^^^ one of the two opaque types used here has to be outside its defining scope | note: opaque type whose hidden type is being assigned --> $DIR/issue-70877.rs:28:13 | LL | fn oof() -> impl std::fmt::Debug { | ^^^^^^^^^^^^^^^^^^^^ note: opaque type being used as hidden type --> $DIR/issue-70877.rs:4:15 | LL | type FooRet = impl std::fmt::Debug; | ^^^^^^^^^^^^^^^^^^^^ error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0308`.