TypeId::of::<Self>()
}
- /// Returns a stack backtrace, if available, of where this error occurred.
- ///
- /// This function allows inspecting the location, in code, of where an error
- /// happened. The returned `Backtrace` contains information about the stack
- /// trace of the OS thread of execution of where the error originated from.
- ///
- /// Note that not all errors contain a `Backtrace`. Also note that a
- /// `Backtrace` may actually be empty. For more information consult the
- /// `Backtrace` type itself.
- #[unstable(feature = "backtrace", issue = "53487")]
- fn backtrace(&self) -> Option<&Backtrace> {
- None
- }
-
/// ```
/// if let Err(e) = "xc".parse::<u32>() {
/// // Print `e` itself, no need for description().
/// assert!(core::ptr::eq(&error.backtrace, backtrace_ref));
/// }
/// ```
- #[unstable(feature = "error_generic_member_access", issue = "none")]
+ #[unstable(feature = "error_generic_member_access", issue = "99301")]
#[allow(unused_variables)]
fn provide<'a>(&'a self, req: &mut Demand<'a>) {}
}
-#[unstable(feature = "error_generic_member_access", issue = "none")]
-impl Provider for dyn Error + 'static {
+#[unstable(feature = "error_generic_member_access", issue = "99301")]
+impl<'b> Provider for dyn Error + 'b {
fn provide<'a>(&'a self, req: &mut Demand<'a>) {
self.provide(req)
}
Error::source(&**self)
}
- fn backtrace(&self) -> Option<&Backtrace> {
- Error::backtrace(&**self)
+ fn provide<'b>(&'b self, req: &mut Demand<'b>) {
+ Error::provide(&**self, req);
}
}
Error::source(&**self)
}
- fn backtrace(&self) -> Option<&Backtrace> {
- Error::backtrace(&**self)
+ fn provide<'a>(&'a self, req: &mut Demand<'a>) {
+ Error::provide(&**self, req);
}
}
}
}
+impl<'a> dyn Error + 'a {
+ /// Request a reference of type `T` as context about this error.
+ #[unstable(feature = "error_generic_member_access", issue = "99301")]
+ pub fn request_ref<T: ?Sized + 'static>(&'a self) -> Option<&'a T> {
+ core::any::request_ref(self)
+ }
+
+ /// Request a value of type `T` as context about this error.
+ #[unstable(feature = "error_generic_member_access", issue = "99301")]
+ pub fn request_value<T: 'static>(&'a self) -> Option<T> {
+ core::any::request_value(self)
+ }
+}
+
// Copied from `any.rs`.
impl dyn Error + 'static {
/// Returns `true` if the inner type is the same as `T`.
None
}
}
-
- /// Request a reference of type `T` as context about this error.
- #[unstable(feature = "error_generic_member_access", issue = "none")]
- pub fn request_ref<T: ?Sized + 'static>(&self) -> Option<&T> {
- core::any::request_ref(self)
- }
-
- /// Request a value of type `T` as context about this error.
- #[unstable(feature = "error_generic_member_access", issue = "none")]
- pub fn request_value<T: 'static>(&self) -> Option<T> {
- core::any::request_value(self)
- }
}
impl dyn Error + 'static + Send {
}
/// Request a reference of type `T` as context about this error.
- #[unstable(feature = "error_generic_member_access", issue = "none")]
+ #[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_ref<T: ?Sized + 'static>(&self) -> Option<&T> {
- <dyn Error + 'static>::request_ref(self)
+ <dyn Error>::request_ref(self)
}
/// Request a value of type `T` as context about this error.
- #[unstable(feature = "error_generic_member_access", issue = "none")]
+ #[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_value<T: 'static>(&self) -> Option<T> {
- <dyn Error + 'static>::request_value(self)
+ <dyn Error>::request_value(self)
}
}
}
/// Request a reference of type `T` as context about this error.
- #[unstable(feature = "error_generic_member_access", issue = "none")]
+ #[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_ref<T: ?Sized + 'static>(&self) -> Option<&T> {
- <dyn Error + 'static>::request_ref(self)
+ <dyn Error>::request_ref(self)
}
/// Request a value of type `T` as context about this error.
- #[unstable(feature = "error_generic_member_access", issue = "none")]
+ #[unstable(feature = "error_generic_member_access", issue = "99301")]
pub fn request_value<T: 'static>(&self) -> Option<T> {
- <dyn Error + 'static>::request_value(self)
+ <dyn Error>::request_value(self)
}
}
/// ```rust
/// #![feature(error_reporter)]
/// #![feature(backtrace)]
+ /// #![feature(provide_any)]
+ /// #![feature(error_generic_member_access)]
/// # use std::error::Error;
/// # use std::fmt;
+ /// use std::any::Demand;
/// use std::error::Report;
/// use std::backtrace::Backtrace;
///
/// }
///
/// impl Error for SuperErrorSideKick {
- /// fn backtrace(&self) -> Option<&Backtrace> {
- /// Some(&self.backtrace)
+ /// fn provide<'a>(&'a self, req: &mut Demand<'a>) {
+ /// req
+ /// .provide_ref::<Backtrace>(&self.backtrace);
/// }
/// }
///
fn backtrace(&self) -> Option<&Backtrace> {
// have to grab the backtrace on the first error directly since that error may not be
// 'static
- let backtrace = self.error.backtrace();
+ let backtrace = (&self.error as &dyn Error).request_ref();
let backtrace = backtrace.or_else(|| {
self.error
.source()
- .map(|source| source.chain().find_map(|source| source.backtrace()))
+ .map(|source| source.chain().find_map(|source| source.request_ref()))
.flatten()
});
backtrace
fn backtrace(&self) -> Option<&Backtrace> {
// have to grab the backtrace on the first error directly since that error may not be
// 'static
- let backtrace = self.error.backtrace();
+ let backtrace = self.error.request_ref();
let backtrace = backtrace.or_else(|| {
self.error
.source()
- .map(|source| source.chain().find_map(|source| source.backtrace()))
+ .map(|source| source.chain().find_map(|source| source.request_ref()))
.flatten()
});
backtrace