Skip to content

Commit

Permalink
Auto merge of #99431 - yaahc:error-in-core, r=joshtriplett
Browse files Browse the repository at this point in the history
Remove `fn backtrace` and replace with usages of provider API

This PR is part of moving error into core and has been split to facilitate review.
  • Loading branch information
bors committed Aug 2, 2022
2 parents 9d5cd21 + b2bbca3 commit 9538d2d
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 43 deletions.
74 changes: 33 additions & 41 deletions library/std/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -260,20 +260,6 @@ pub trait Error: Debug + Display {
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().
Expand Down Expand Up @@ -370,7 +356,7 @@ pub trait Error: Debug + Display {
}

#[unstable(feature = "error_generic_member_access", issue = "99301")]
impl Provider for dyn Error + 'static {
impl<'b> Provider for dyn Error + 'b {
fn provide<'a>(&'a self, req: &mut Demand<'a>) {
self.provide(req)
}
Expand Down Expand Up @@ -757,8 +743,8 @@ impl<'a, T: Error + ?Sized> Error for &'a T {
Error::source(&**self)
}

fn backtrace(&self) -> Option<&Backtrace> {
Error::backtrace(&**self)
fn provide<'b>(&'b self, req: &mut Demand<'b>) {
Error::provide(&**self, req);
}
}

Expand All @@ -778,8 +764,8 @@ impl<T: Error + ?Sized> Error for Arc<T> {
Error::source(&**self)
}

fn backtrace(&self) -> Option<&Backtrace> {
Error::backtrace(&**self)
fn provide<'a>(&'a self, req: &mut Demand<'a>) {
Error::provide(&**self, req);
}
}

Expand Down Expand Up @@ -871,6 +857,20 @@ impl Error for alloc::ffi::IntoStringError {
}
}

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`.
Expand Down Expand Up @@ -910,18 +910,6 @@ impl dyn Error + 'static {
None
}
}

/// 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>(&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 = "99301")]
pub fn request_value<T: 'static>(&self) -> Option<T> {
core::any::request_value(self)
}
}

impl dyn Error + 'static + Send {
Expand Down Expand Up @@ -949,13 +937,13 @@ impl dyn Error + 'static + Send {
/// 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>(&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 = "99301")]
pub fn request_value<T: 'static>(&self) -> Option<T> {
<dyn Error + 'static>::request_value(self)
<dyn Error>::request_value(self)
}
}

Expand Down Expand Up @@ -984,13 +972,13 @@ impl dyn Error + 'static + Send + Sync {
/// 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>(&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 = "99301")]
pub fn request_value<T: 'static>(&self) -> Option<T> {
<dyn Error + 'static>::request_value(self)
<dyn Error>::request_value(self)
}
}

Expand Down Expand Up @@ -1467,8 +1455,11 @@ impl<E> Report<E> {
/// ```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;
///
Expand Down Expand Up @@ -1498,8 +1489,9 @@ impl<E> Report<E> {
/// }
///
/// 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);
/// }
/// }
///
Expand Down Expand Up @@ -1552,11 +1544,11 @@ where
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
Expand Down Expand Up @@ -1618,11 +1610,11 @@ impl Report<Box<dyn Error>> {
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
Expand Down
5 changes: 3 additions & 2 deletions library/std/src/error/tests.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use super::Error;
use crate::fmt;
use core::any::Demand;

#[derive(Debug, PartialEq)]
struct A;
Expand Down Expand Up @@ -198,8 +199,8 @@ where
self.source.as_deref()
}

fn backtrace(&self) -> Option<&Backtrace> {
self.backtrace.as_ref()
fn provide<'a>(&'a self, req: &mut Demand<'a>) {
self.backtrace.as_ref().map(|bt| req.provide_ref::<Backtrace>(bt));
}
}

Expand Down

0 comments on commit 9538d2d

Please sign in to comment.