Change:
currently requires , while requires . I'm unsure of what each should require, but I think they should agree so that it is possible to have code which returns (which is useful to allow try! across functions returning different types of error codes), and be able to the results.
There was a lengthy discussion about this towards the bottom of the RFC:
/cc , I vaguely remember this might change? If not, then this should be in the RFCs repo.
Nominating for 1.0-beta P-backcompat-libs. (The trait isn't yet, but it probably will be for 1.0).
0 beta, P-backcompat-libs, I-needs-decision.

Discussion:
#![stable(feature = "rust1", since = "1.0.0")] use prelude::*; <del> use fmt::Display; </del> <ins> use fmt::{Debug, Display}; </ins> /// Base functionality for all errors in Rust. <del> #[unstable(feature = "core", reason = "the exact API of this trait may change")] pub trait Error: Display { /// A short description of the error; usually a static string. </del> <ins> #[stable(feature = "rust1", since = "1.0.0")] pub trait Error: Debug + Display + Send { /// A short description of the error. /// /// The description should not contain newlines or sentence-ending /// punctuation, to facilitate embedding in larger user-facing /// strings. #[stable(feature = "rust1", since = "1.0.0")] </ins> fn description(&self) -> &str; /// The lower-level cause of this error, if any. <ins> #[stable(feature = "rust1", since = "1.0.0")] </ins> fn cause(&self) -> Option<&Error> { None } }

} #[stable(feature = "rust1", since = "1.0.0")] <del> impl<W> error::Error for IntoInnerError<W> { </del> <ins> impl<W: Send + fmt::Debug> error::Error for IntoInnerError<W> { </ins> fn description(&self) -> &str { error::Error::description(self.error()) }

} #[stable(feature = "rust1", since = "1.0.0")] <del> impl<T> error::Error for SendError<T> { </del> <ins> impl<T: Send> error::Error for SendError<T> { </ins> fn description(&self) -> &str { "sending on a closed channel"

} #[stable(feature = "rust1", since = "1.0.0")] <del> impl<T> error::Error for TrySendError<T> { </del> <ins> impl<T: Send> error::Error for TrySendError<T> { </ins> fn description(&self) -> &str { match *self {

#[stable(feature = "rust1", since = "1.0.0")] impl<T> fmt::Display for PoisonError<T> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { <del> self.description().fmt(f) </del> <ins> "poisoned lock: another task failed inside".fmt(f) </ins> } } <del> impl<T> Error for PoisonError<T> { </del> <ins> impl<T: Send> Error for PoisonError<T> { </ins> fn description(&self) -> &str { "poisoned lock: another task failed inside" }

} #[stable(feature = "rust1", since = "1.0.0")] <del> impl<T> fmt::Display for TryLockError<T> { </del> <ins> impl<T: Send> fmt::Display for TryLockError<T> { </ins> fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { self.description().fmt(f) } } <del> impl<T> Error for TryLockError<T> { </del> <ins> impl<T: Send> Error for TryLockError<T> { </ins> fn description(&self) -> &str { match *self { TryLockError::Poisoned(ref p) => p.description(),

pub type CommandResult<T> = Result<T, CommandError>; pub fn err(s: &str) -> CliError { <ins> #[derive(Debug)] </ins> struct E(String); impl Error for E {