// 3.9 / 7.3: `impl Display for Foo` is removed while the stored Box lives (no coercion // remains in the source): the stored box keeps working through its frozen vtable. use std::cell::RefCell; use std::fmt::Display; struct Foo(u32); trait Named { fn name(&self) -> String { "trait".to_string() } } impl Named for Foo {} impl Foo { fn name(&self) -> String { "inherent".to_string() } } fn caller(f: &Foo) -> String { f.name() } thread_local! { static SHOWN: RefCell>> = RefCell::new(None); } fn store() {} #[test] fn run() { store(); let shown = SHOWN.with(|s| s.borrow().as_ref().map(|d| d.to_string()).unwrap_or_default()); println!("out {} [{}]", caller(&Foo(1)), shown); }