/// Used as a return value to signify a fatal error occurred. (It is also /// used as the argument to panic at the moment, but that will eventually /// not be true.) #[derive(Copy, Clone, Debug)] #[must_use] pub struct FatalError; pub struct FatalErrorMarker; // Don't implement Send on FatalError. This makes it impossible to panic!(FatalError). // We don't want to invoke the panic handler and print a backtrace for fatal errors. impl !Send for FatalError {} impl FatalError { pub fn raise(self) -> ! { std::panic::resume_unwind(Box::new(FatalErrorMarker)) } } impl std::fmt::Display for FatalError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "parser fatal error") } } impl std::error::Error for FatalError { fn description(&self) -> &str { "The parser has encountered a fatal error" } }