blob: 0ffd6cc2cf23008507ad17157a103caf62821e52 [file] [log] [blame]
#![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 { }
//~^ ERROR the trait bound `T: MyDisplay` is not satisfied
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<<S as MPU>::MpuConfig> = None;
let valref: &mut <S as MPU>::MpuConfig = val.as_mut().unwrap();
// // This causes a different ICE (but its similar if you squint right):
// //
// // `Unimplemented` selecting `Binder(<T as MyDisplay>)` during codegen
//
// writer.my_write(valref)
// This one causes the ICE:
// FulfillmentError(Obligation(predicate=Binder(TraitPredicate(<T as MyDisplay>)),
// depth=1),Unimplemented)
let closure = |config: &mut <S as MPU>::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();
}