trait DynIncompatible { fn foo() -> Self; } trait DynCompatible { fn bar(&self); } struct A; struct B; impl DynIncompatible for A { fn foo() -> Self { A } } impl DynIncompatible for B { fn foo() -> Self { B } } impl DynCompatible for A { fn bar(&self) {} } impl DynCompatible for B { fn bar(&self) {} } fn can() -> impl DynIncompatible { if true { return A; } B //~ ERROR mismatched types } fn cat() -> impl DynCompatible { if true { return A; } B //~ ERROR mismatched types } fn main() {}