#![feature(associated_type_defaults)] trait MyDisplay { fn method(&self) { } } impl<'a, T: MyDisplay> MyDisplay for &'a mut T { } struct T; trait MPU { type MpuConfig: MyDisplay = T; //~^ ERROR the trait bound `T: MyDisplay` is not satisfied } struct S; impl MPU for S { } trait MyWrite { fn my_write(&self, _: &dyn MyDisplay) { } } trait ProcessType { fn process_detail_fmt(&self, _: &mut dyn MyWrite); } struct Process; impl ProcessType for Process { fn process_detail_fmt(&self, writer: &mut dyn MyWrite) { let mut val: Option<::MpuConfig> = None; let valref: &mut ::MpuConfig = val.as_mut().unwrap(); // // This causes a different ICE (but its similar if you squint right): // // // // `Unimplemented` selecting `Binder()` during codegen // writer.my_write(valref) //~^ ERROR the trait bound `T: MyDisplay` is not satisfied // This one causes the ICE: // FulfillmentError(Obligation(predicate=Binder(TraitPredicate()), // depth=1),Unimplemented) /*let closure = |config: &mut ::MpuConfig| writer.my_write(&config); closure(valref);*/ } } fn create() -> &'static dyn ProcessType { let input: Option<&mut Process> = None; let process: &mut Process = input.unwrap(); process } pub fn main() { create(); }