#![allow(bare_trait_objects)] trait DynIncompatible { fn foo() -> Self; } struct A; struct B; impl DynIncompatible for A { fn foo() -> Self { A } } impl DynIncompatible for B { fn foo() -> Self { B } } fn car() -> dyn DynIncompatible { //~ ERROR the trait `DynIncompatible` is not dyn compatible //~^ ERROR return type cannot be a trait object without pointer indirection //~| ERROR the trait `DynIncompatible` is not dyn compatible //~| ERROR the trait `DynIncompatible` is not dyn compatible if true { return A; } B } fn cat() -> Box { //~ ERROR the trait `DynIncompatible` is not dyn compatible if true { return Box::new(A); } Box::new(B) } fn main() {}