| #![feature(thin_box)] | |
| //@ run-pass | |
| use std::boxed::ThinBox; | |
| use std::error::Error; | |
| use std::{fmt, mem}; | |
| use std::ops::DerefMut; | |
| const EXPECTED: &str = "boooo!"; | |
| fn main() { | |
| let thin_error: ThinBox<dyn Error> = ThinBox::new_unsize(Foo); | |
| assert_eq!(mem::size_of::<*const i32>(), mem::size_of_val(&thin_error)); | |
| let msg = thin_error.to_string(); | |
| assert_eq!(EXPECTED, msg); | |
| let mut thin_concrete_error: ThinBox<Foo> = ThinBox::new(Foo); | |
| assert_eq!(mem::size_of::<*const i32>(), mem::size_of_val(&thin_concrete_error)); | |
| let msg = thin_concrete_error.to_string(); | |
| assert_eq!(EXPECTED, msg); | |
| let inner = thin_concrete_error.deref_mut(); | |
| let msg = inner.to_string(); | |
| assert_eq!(EXPECTED, msg); | |
| } | |
| #[derive(Debug)] | |
| struct Foo; | |
| impl fmt::Display for Foo { | |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| write!(f, "{}", EXPECTED) | |
| } | |
| } | |
| impl Error for Foo {} |