Deprecate Error::description for real

`description` has been documented as soft-deprecated since 1.27.0 (17
months ago). There is no longer any reason to call it or implement it.

This commit:

- adds #[rustc_deprecated(since = "1.41.0")] to Error::description;

- moves description (and cause, which is also deprecated) below the
  source and backtrace methods in the Error trait;

- reduces documentation of description and cause to take up much less
  vertical real estate in rustdocs, while preserving the example that
  shows how to render errors without needing to call description;

- removes the description function of all *currently unstable* Error
  impls in the standard library;

- marks #[allow(deprecated)] the description function of all *stable*
  Error impls in the standard library;

- replaces miscellaneous uses of description in example code and the
  compiler.
This commit is contained in:
David Tolnay 2019-11-30 20:01:48 -08:00
parent c5a2a9a99c
commit 4646a88b7a
No known key found for this signature in database
GPG key ID: F9BA143B95FF6D82
30 changed files with 107 additions and 200 deletions

View file

@ -2,7 +2,6 @@ use std::error;
use std::fmt;
use std::fs;
use std::io;
use std::str;
pub fn arg_expand(arg: String) -> Result<Vec<String>, Error> {
if arg.starts_with("@") {
@ -36,8 +35,4 @@ impl fmt::Display for Error {
}
}
impl error::Error for Error {
fn description(&self) -> &'static str {
"argument error"
}
}
impl error::Error for Error {}

View file

@ -10,23 +10,23 @@ For example, in the below example, since the enum is marked as
on it.
```rust,ignore (pseudo-Rust)
use std::error::Error as StdError;
#[non_exhaustive] pub enum Error {
Message(String),
Other,
#[non_exhaustive]
pub enum Error {
Message(String),
Other,
}
impl StdError for Error {
fn description(&self) -> &str {
impl Display for Error {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
// This will not error, despite being marked as non_exhaustive, as this
// enum is defined within the current crate, it can be matched
// exhaustively.
match *self {
Message(ref s) => s,
Other => "other or unknown error",
}
}
let display = match self {
Message(s) => s,
Other => "other or unknown error",
};
formatter.write_str(display)
}
}
```
@ -38,9 +38,9 @@ use mycrate::Error;
// This will not error as the non_exhaustive Error enum has been matched with a
// wildcard.
match error {
Message(ref s) => ...,
Other => ...,
_ => ...,
Message(s) => ...,
Other => ...,
_ => ...,
}
```

View file

@ -253,11 +253,7 @@ impl fmt::Display for ExplicitBug {
}
}
impl error::Error for ExplicitBug {
fn description(&self) -> &str {
"The parser has encountered an internal bug"
}
}
impl error::Error for ExplicitBug {}
pub use diagnostic::{Diagnostic, DiagnosticId, DiagnosticStyledString, SubDiagnostic};
pub use diagnostic_builder::DiagnosticBuilder;

View file

@ -197,19 +197,7 @@ impl fmt::Display for ConstEvalError {
}
}
impl Error for ConstEvalError {
fn description(&self) -> &str {
use self::ConstEvalError::*;
match *self {
NeedsRfc(_) => "this feature needs an rfc before being allowed inside constants",
ConstAccessesStatic => "constant accesses static",
}
}
fn cause(&self) -> Option<&dyn Error> {
None
}
}
impl Error for ConstEvalError {}
// Extra machine state for CTFE, and the Machine instance
pub struct CompileTimeInterpreter<'mir, 'tcx> {

View file

@ -98,11 +98,7 @@ pub struct Error {
pub error: io::Error,
}
impl error::Error for Error {
fn description(&self) -> &str {
self.error.description()
}
}
impl error::Error for Error {}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {

View file

@ -68,14 +68,7 @@ impl fmt::Display for FromHexError {
}
}
impl error::Error for FromHexError {
fn description(&self) -> &str {
match *self {
InvalidHexCharacter(..) => "invalid character",
InvalidHexLength => "invalid length",
}
}
}
impl error::Error for FromHexError {}
impl FromHex for str {
/// Converts any hexadecimal encoded string (literal, `@`, `&`, or `~`)

View file

@ -345,11 +345,7 @@ impl fmt::Display for DecoderError {
}
}
impl std::error::Error for DecoderError {
fn description(&self) -> &str {
"decoder error"
}
}
impl std::error::Error for DecoderError {}
impl fmt::Display for EncoderError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
@ -358,11 +354,7 @@ impl fmt::Display for EncoderError {
}
}
impl std::error::Error for EncoderError {
fn description(&self) -> &str {
"encoder error"
}
}
impl std::error::Error for EncoderError {}
impl From<fmt::Error> for EncoderError {
/// Converts a [`fmt::Error`] into `EncoderError`

View file

@ -284,6 +284,7 @@ impl fmt::Display for VarError {
#[stable(feature = "env", since = "1.0.0")]
impl Error for VarError {
#[allow(deprecated)]
fn description(&self) -> &str {
match *self {
VarError::NotPresent => "environment variable not found",
@ -526,6 +527,7 @@ impl fmt::Display for JoinPathsError {
#[stable(feature = "env", since = "1.0.0")]
impl Error for JoinPathsError {
#[allow(deprecated, deprecated_in_future)]
fn description(&self) -> &str {
self.inner.description()
}

View file

@ -45,92 +45,6 @@ use crate::string;
/// [`source`]: trait.Error.html#method.source
#[stable(feature = "rust1", since = "1.0.0")]
pub trait Error: Debug + Display {
/// **This method is soft-deprecated.**
///
/// Although using it wont cause compilation warning,
/// new code should use [`Display`] instead
/// and new `impl`s can omit it.
///
/// To obtain error description as a string, use `to_string()`.
///
/// [`Display`]: ../fmt/trait.Display.html
///
/// # Examples
///
/// ```
/// match "xc".parse::<u32>() {
/// Err(e) => {
/// // Print `e` itself, not `e.description()`.
/// println!("Error: {}", e);
/// }
/// _ => println!("No error"),
/// }
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
fn description(&self) -> &str {
"description() is deprecated; use Display"
}
/// The lower-level cause of this error, if any.
///
/// # Examples
///
/// ```
/// use std::error::Error;
/// use std::fmt;
///
/// #[derive(Debug)]
/// struct SuperError {
/// side: SuperErrorSideKick,
/// }
///
/// impl fmt::Display for SuperError {
/// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
/// write!(f, "SuperError is here!")
/// }
/// }
///
/// impl Error for SuperError {
/// fn cause(&self) -> Option<&dyn Error> {
/// Some(&self.side)
/// }
/// }
///
/// #[derive(Debug)]
/// struct SuperErrorSideKick;
///
/// impl fmt::Display for SuperErrorSideKick {
/// fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
/// write!(f, "SuperErrorSideKick is here!")
/// }
/// }
///
/// impl Error for SuperErrorSideKick {}
///
/// fn get_super_error() -> Result<(), SuperError> {
/// Err(SuperError { side: SuperErrorSideKick })
/// }
///
/// fn main() {
/// match get_super_error() {
/// Err(e) => {
/// println!("Error: {}", e.description());
/// println!("Caused by: {}", e.cause().unwrap());
/// }
/// _ => println!("No error"),
/// }
/// }
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_deprecated(
since = "1.33.0",
reason = "replaced by Error::source, which can support \
downcasting"
)]
fn cause(&self) -> Option<&dyn Error> {
self.source()
}
/// The lower-level source of this error, if any.
///
/// # Examples
@ -213,6 +127,28 @@ pub trait Error: Debug + Display {
fn backtrace(&self) -> Option<&Backtrace> {
None
}
/// ```
/// if let Err(e) = "xc".parse::<u32>() {
/// // Print `e` itself, no need for description().
/// eprintln!("Error: {}", e);
/// }
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_deprecated(since = "1.41.0", reason = "use the Display impl or to_string()")]
fn description(&self) -> &str {
"description() is deprecated; use Display"
}
#[stable(feature = "rust1", since = "1.0.0")]
#[rustc_deprecated(
since = "1.33.0",
reason = "replaced by Error::source, which can support downcasting"
)]
#[allow(missing_docs)]
fn cause(&self) -> Option<&dyn Error> {
self.source()
}
}
mod private {
@ -318,6 +254,7 @@ impl From<String> for Box<dyn Error + Send + Sync> {
struct StringError(String);
impl Error for StringError {
#[allow(deprecated)]
fn description(&self) -> &str {
&self.0
}
@ -454,47 +391,32 @@ impl<'a> From<Cow<'a, str>> for Box<dyn Error> {
}
#[unstable(feature = "never_type", issue = "35121")]
impl Error for ! {
fn description(&self) -> &str {
*self
}
}
impl Error for ! {}
#[unstable(
feature = "allocator_api",
reason = "the precise API and guarantees it provides may be tweaked.",
issue = "32838"
)]
impl Error for AllocErr {
fn description(&self) -> &str {
"memory allocation failed"
}
}
impl Error for AllocErr {}
#[unstable(
feature = "allocator_api",
reason = "the precise API and guarantees it provides may be tweaked.",
issue = "32838"
)]
impl Error for LayoutErr {
fn description(&self) -> &str {
"invalid parameters to Layout::from_size_align"
}
}
impl Error for LayoutErr {}
#[unstable(
feature = "allocator_api",
reason = "the precise API and guarantees it provides may be tweaked.",
issue = "32838"
)]
impl Error for CannotReallocInPlace {
fn description(&self) -> &str {
CannotReallocInPlace::description(self)
}
}
impl Error for CannotReallocInPlace {}
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for str::ParseBoolError {
#[allow(deprecated)]
fn description(&self) -> &str {
"failed to parse bool"
}
@ -502,6 +424,7 @@ impl Error for str::ParseBoolError {
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for str::Utf8Error {
#[allow(deprecated)]
fn description(&self) -> &str {
"invalid utf-8: corrupt contents"
}
@ -509,6 +432,7 @@ impl Error for str::Utf8Error {
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for num::ParseIntError {
#[allow(deprecated)]
fn description(&self) -> &str {
self.__description()
}
@ -516,6 +440,7 @@ impl Error for num::ParseIntError {
#[stable(feature = "try_from", since = "1.34.0")]
impl Error for num::TryFromIntError {
#[allow(deprecated)]
fn description(&self) -> &str {
self.__description()
}
@ -523,6 +448,7 @@ impl Error for num::TryFromIntError {
#[stable(feature = "try_from", since = "1.34.0")]
impl Error for array::TryFromSliceError {
#[allow(deprecated)]
fn description(&self) -> &str {
self.__description()
}
@ -530,6 +456,7 @@ impl Error for array::TryFromSliceError {
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for num::ParseFloatError {
#[allow(deprecated)]
fn description(&self) -> &str {
self.__description()
}
@ -537,6 +464,7 @@ impl Error for num::ParseFloatError {
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for string::FromUtf8Error {
#[allow(deprecated)]
fn description(&self) -> &str {
"invalid utf-8"
}
@ -544,6 +472,7 @@ impl Error for string::FromUtf8Error {
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for string::FromUtf16Error {
#[allow(deprecated)]
fn description(&self) -> &str {
"invalid utf-16"
}
@ -558,6 +487,7 @@ impl Error for string::ParseError {
#[stable(feature = "decode_utf16", since = "1.9.0")]
impl Error for char::DecodeUtf16Error {
#[allow(deprecated)]
fn description(&self) -> &str {
"unpaired surrogate found"
}
@ -565,6 +495,7 @@ impl Error for char::DecodeUtf16Error {
#[stable(feature = "box_error", since = "1.8.0")]
impl<T: Error> Error for Box<T> {
#[allow(deprecated, deprecated_in_future)]
fn description(&self) -> &str {
Error::description(&**self)
}
@ -581,6 +512,7 @@ impl<T: Error> Error for Box<T> {
#[stable(feature = "fmt_error", since = "1.11.0")]
impl Error for fmt::Error {
#[allow(deprecated)]
fn description(&self) -> &str {
"an error occurred when formatting an argument"
}
@ -588,6 +520,7 @@ impl Error for fmt::Error {
#[stable(feature = "try_borrow", since = "1.13.0")]
impl Error for cell::BorrowError {
#[allow(deprecated)]
fn description(&self) -> &str {
"already mutably borrowed"
}
@ -595,6 +528,7 @@ impl Error for cell::BorrowError {
#[stable(feature = "try_borrow", since = "1.13.0")]
impl Error for cell::BorrowMutError {
#[allow(deprecated)]
fn description(&self) -> &str {
"already borrowed"
}
@ -602,6 +536,7 @@ impl Error for cell::BorrowMutError {
#[stable(feature = "try_from", since = "1.34.0")]
impl Error for char::CharTryFromError {
#[allow(deprecated)]
fn description(&self) -> &str {
"converted integer out of range for `char`"
}
@ -609,6 +544,7 @@ impl Error for char::CharTryFromError {
#[stable(feature = "char_from_str", since = "1.20.0")]
impl Error for char::ParseCharError {
#[allow(deprecated)]
fn description(&self) -> &str {
self.__description()
}
@ -846,16 +782,8 @@ mod tests {
}
}
impl Error for A {
fn description(&self) -> &str {
"A-desc"
}
}
impl Error for B {
fn description(&self) -> &str {
"A-desc"
}
}
impl Error for A {}
impl Error for B {}
#[test]
fn downcasting() {

View file

@ -878,6 +878,7 @@ impl NulError {
#[stable(feature = "rust1", since = "1.0.0")]
impl Error for NulError {
#[allow(deprecated)]
fn description(&self) -> &str {
"nul byte found in data"
}
@ -903,6 +904,7 @@ impl From<NulError> for io::Error {
#[stable(feature = "frombyteswithnulerror_impls", since = "1.17.0")]
impl Error for FromBytesWithNulError {
#[allow(deprecated)]
fn description(&self) -> &str {
match self.kind {
FromBytesWithNulErrorKind::InteriorNul(..) => {
@ -915,6 +917,7 @@ impl Error for FromBytesWithNulError {
#[stable(feature = "frombyteswithnulerror_impls", since = "1.17.0")]
impl fmt::Display for FromBytesWithNulError {
#[allow(deprecated, deprecated_in_future)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.description())?;
if let FromBytesWithNulErrorKind::InteriorNul(pos) = self.kind {
@ -943,6 +946,7 @@ impl IntoStringError {
#[stable(feature = "cstring_into", since = "1.7.0")]
impl Error for IntoStringError {
#[allow(deprecated)]
fn description(&self) -> &str {
"C string contained non-utf8 bytes"
}
@ -954,6 +958,7 @@ impl Error for IntoStringError {
#[stable(feature = "cstring_into", since = "1.7.0")]
impl fmt::Display for IntoStringError {
#[allow(deprecated, deprecated_in_future)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.description().fmt(f)
}

View file

@ -752,6 +752,7 @@ impl<W> From<IntoInnerError<W>> for Error {
#[stable(feature = "rust1", since = "1.0.0")]
impl<W: Send + fmt::Debug> error::Error for IntoInnerError<W> {
#[allow(deprecated, deprecated_in_future)]
fn description(&self) -> &str {
error::Error::description(self.error())
}

View file

@ -534,6 +534,7 @@ impl fmt::Display for Error {
#[stable(feature = "rust1", since = "1.0.0")]
impl error::Error for Error {
#[allow(deprecated, deprecated_in_future)]
fn description(&self) -> &str {
match self.repr {
Repr::Os(..) | Repr::Simple(..) => self.kind().as_str(),
@ -603,22 +604,18 @@ mod test {
struct TestError;
impl fmt::Display for TestError {
fn fmt(&self, _: &mut fmt::Formatter<'_>) -> fmt::Result {
Ok(())
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("asdf")
}
}
impl error::Error for TestError {
fn description(&self) -> &str {
"asdf"
}
}
impl error::Error for TestError {}
// we have to call all of these UFCS style right now since method
// resolution won't implicitly drop the Send+Sync bounds
let mut err = Error::new(ErrorKind::Other, TestError);
assert!(err.get_ref().unwrap().is::<TestError>());
assert_eq!("asdf", err.get_ref().unwrap().description());
assert_eq!("asdf", err.get_ref().unwrap().to_string());
assert!(err.get_mut().unwrap().is::<TestError>());
let extracted = err.into_inner().unwrap();
extracted.downcast::<TestError>().unwrap();

View file

@ -363,6 +363,7 @@ pub struct AddrParseError(());
#[stable(feature = "addr_parse_error_error", since = "1.4.0")]
impl fmt::Display for AddrParseError {
#[allow(deprecated, deprecated_in_future)]
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt.write_str(self.description())
}
@ -370,6 +371,7 @@ impl fmt::Display for AddrParseError {
#[stable(feature = "addr_parse_error_error", since = "1.4.0")]
impl Error for AddrParseError {
#[allow(deprecated)]
fn description(&self) -> &str {
"invalid IP address syntax"
}

View file

@ -2786,6 +2786,7 @@ impl_cmp_os_str!(Cow<'a, Path>, OsString);
#[stable(since = "1.7.0", feature = "strip_prefix")]
impl fmt::Display for StripPrefixError {
#[allow(deprecated, deprecated_in_future)]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.description().fmt(f)
}
@ -2793,6 +2794,7 @@ impl fmt::Display for StripPrefixError {
#[stable(since = "1.7.0", feature = "strip_prefix")]
impl Error for StripPrefixError {
#[allow(deprecated)]
fn description(&self) -> &str {
"prefix not found"
}

View file

@ -1550,6 +1550,7 @@ impl<T> fmt::Display for SendError<T> {
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: Send> error::Error for SendError<T> {
#[allow(deprecated)]
fn description(&self) -> &str {
"sending on a closed channel"
}
@ -1577,6 +1578,7 @@ impl<T> fmt::Display for TrySendError<T> {
#[stable(feature = "rust1", since = "1.0.0")]
impl<T: Send> error::Error for TrySendError<T> {
#[allow(deprecated)]
fn description(&self) -> &str {
match *self {
TrySendError::Full(..) => "sending on a full channel",
@ -1603,6 +1605,7 @@ impl fmt::Display for RecvError {
#[stable(feature = "rust1", since = "1.0.0")]
impl error::Error for RecvError {
#[allow(deprecated)]
fn description(&self) -> &str {
"receiving on a closed channel"
}
@ -1620,6 +1623,7 @@ impl fmt::Display for TryRecvError {
#[stable(feature = "rust1", since = "1.0.0")]
impl error::Error for TryRecvError {
#[allow(deprecated)]
fn description(&self) -> &str {
match *self {
TryRecvError::Empty => "receiving on an empty channel",
@ -1649,6 +1653,7 @@ impl fmt::Display for RecvTimeoutError {
#[stable(feature = "mpsc_recv_timeout_error", since = "1.15.0")]
impl error::Error for RecvTimeoutError {
#[allow(deprecated)]
fn description(&self) -> &str {
match *self {
RecvTimeoutError::Timeout => "timed out waiting on channel",

View file

@ -63,6 +63,7 @@ impl fmt::Display for JoinPathsError {
}
impl StdError for JoinPathsError {
#[allow(deprecated)]
fn description(&self) -> &str {
"not supported on CloudABI yet"
}

View file

@ -61,6 +61,7 @@ impl fmt::Display for JoinPathsError {
}
impl StdError for JoinPathsError {
#[allow(deprecated)]
fn description(&self) -> &str {
"not supported on hermit yet"
}

View file

@ -440,6 +440,7 @@ pub struct NonIpSockAddr {
}
impl error::Error for NonIpSockAddr {
#[allow(deprecated)]
fn description(&self) -> &str {
"Failed to convert address to SocketAddr"
}

View file

@ -66,6 +66,7 @@ impl fmt::Display for JoinPathsError {
}
impl StdError for JoinPathsError {
#[allow(deprecated)]
fn description(&self) -> &str {
"not supported in SGX yet"
}

View file

@ -213,6 +213,7 @@ impl fmt::Display for JoinPathsError {
}
impl StdError for JoinPathsError {
#[allow(deprecated)]
fn description(&self) -> &str {
"failed to join paths"
}

View file

@ -173,6 +173,7 @@ impl fmt::Display for JoinPathsError {
}
impl StdError for JoinPathsError {
#[allow(deprecated)]
fn description(&self) -> &str {
"failed to join paths"
}

View file

@ -78,6 +78,7 @@ impl fmt::Display for JoinPathsError {
}
impl StdError for JoinPathsError {
#[allow(deprecated)]
fn description(&self) -> &str {
"not supported on wasm yet"
}

View file

@ -53,6 +53,7 @@ impl fmt::Display for JoinPathsError {
}
impl StdError for JoinPathsError {
#[allow(deprecated)]
fn description(&self) -> &str {
"not supported on wasm yet"
}

View file

@ -225,6 +225,7 @@ impl fmt::Display for JoinPathsError {
}
impl StdError for JoinPathsError {
#[allow(deprecated)]
fn description(&self) -> &str {
"failed to join paths"
}

View file

@ -148,6 +148,7 @@ impl<T> fmt::Display for PoisonError<T> {
#[stable(feature = "rust1", since = "1.0.0")]
impl<T> Error for PoisonError<T> {
#[allow(deprecated)]
fn description(&self) -> &str {
"poisoned lock: another task failed inside"
}
@ -239,6 +240,7 @@ impl<T> fmt::Display for TryLockError<T> {
#[stable(feature = "rust1", since = "1.0.0")]
impl<T> Error for TryLockError<T> {
#[allow(deprecated, deprecated_in_future)]
fn description(&self) -> &str {
match *self {
TryLockError::Poisoned(ref p) => p.description(),
@ -246,6 +248,7 @@ impl<T> Error for TryLockError<T> {
}
}
#[allow(deprecated)]
fn cause(&self) -> Option<&dyn Error> {
match *self {
TryLockError::Poisoned(ref p) => Some(p),

View file

@ -621,6 +621,7 @@ impl SystemTimeError {
#[stable(feature = "time2", since = "1.8.0")]
impl Error for SystemTimeError {
#[allow(deprecated)]
fn description(&self) -> &str {
"other time was not earlier than self"
}

View file

@ -23,8 +23,4 @@ impl std::fmt::Display for FatalError {
}
}
impl std::error::Error for FatalError {
fn description(&self) -> &str {
"The parser has encountered a fatal error"
}
}
impl std::error::Error for FatalError {}

View file

@ -42,14 +42,10 @@ pub enum Error {
}
impl error::Error for Error {
fn description(&self) -> &str {
"failed to create TermInfo"
}
fn cause(&self) -> Option<&dyn error::Error> {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
use Error::*;
match *self {
IoError(ref e) => Some(e),
match self {
IoError(e) => Some(e),
_ => None,
}
}

View file

@ -10,7 +10,7 @@ error: internal compiler error: mutable allocation in constant
LL | const MUTABLE_BEHIND_RAW: *mut i32 = &UnsafeCell::new(42) as *const _ as *mut _;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:349:17
thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:345:17
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
error: internal compiler error: unexpected panic

View file

@ -286,7 +286,7 @@ fn main() {
let (format, dst) = parse_args();
let result = syntax::with_default_globals(move || main_with_result(format, &dst));
if let Err(e) = result {
panic!("{}", e.description());
panic!("{}", e.to_string());
}
}