#![feature(trait_upcasting)] #![allow(incomplete_features)] trait Foo: Bar + Bar {} trait Bar { fn bar(&self) -> Option { None } } fn test_specific(x: &dyn Foo) { let _ = x as &dyn Bar; // OK let _ = x as &dyn Bar; // OK } fn test_unknown_version(x: &dyn Foo) { let _ = x as &dyn Bar<_>; // Ambiguous //~^ ERROR non-primitive cast //~^^ ERROR the trait bound `&dyn Foo: Bar<_>` is not satisfied } fn test_infer_version(x: &dyn Foo) { let a = x as &dyn Bar<_>; // OK let _: Option = a.bar(); } fn main() {}