Skip to content

Commit 8cf1d15

Browse files
authored
Merge pull request #319 from dtolnay/errorprovide
Update to nightly's new Error::provide API
2 parents 496b958 + 31c8dff commit 8cf1d15

File tree

7 files changed

+46
-53
lines changed

7 files changed

+46
-53
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ backtrace = { version = "0.3.51", optional = true }
2222
futures = { version = "0.3", default-features = false }
2323
rustversion = "1.0.6"
2424
syn = { version = "2.0", features = ["full"] }
25-
thiserror = "1.0"
25+
thiserror = "1.0.45"
2626
trybuild = { version = "1.0.66", features = ["diff"] }
2727

2828
[lib]

build.rs

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,49 +11,38 @@ compile_error! {
1111
"`backtrace` feature without `std` feature is not supported"
1212
}
1313

14-
// This code exercises the surface area that we expect of the std Backtrace
15-
// type. If the current toolchain is able to compile it, we go ahead and use
16-
// backtrace in anyhow.
14+
// This code exercises the surface area that we expect of the Error generic
15+
// member access API. If the current toolchain is able to compile it, then
16+
// anyhow is able to provide backtrace support.
1717
const PROBE: &str = r#"
18-
#![feature(error_generic_member_access, provide_any)]
18+
#![feature(error_generic_member_access)]
1919
20-
use std::any::{Demand, Provider};
21-
use std::backtrace::{Backtrace, BacktraceStatus};
22-
use std::error::Error;
23-
use std::fmt::{self, Display};
20+
use std::backtrace::Backtrace;
21+
use std::error::{self, Error, Request};
22+
use std::fmt::{self, Debug, Display};
2423
25-
#[derive(Debug)]
26-
struct E {
27-
backtrace: Backtrace,
28-
}
24+
struct MyError(Thing);
25+
struct Thing;
2926
30-
impl Display for E {
27+
impl Debug for MyError {
3128
fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result {
3229
unimplemented!()
3330
}
3431
}
3532
36-
impl Error for E {
37-
fn provide<'a>(&'a self, demand: &mut Demand<'a>) {
38-
demand.provide_ref(&self.backtrace);
33+
impl Display for MyError {
34+
fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result {
35+
unimplemented!()
3936
}
4037
}
4138
42-
struct P;
43-
44-
impl Provider for P {
45-
fn provide<'a>(&'a self, _demand: &mut Demand<'a>) {}
46-
}
47-
48-
const _: fn() = || {
49-
let backtrace: Backtrace = Backtrace::capture();
50-
let status: BacktraceStatus = backtrace.status();
51-
match status {
52-
BacktraceStatus::Captured | BacktraceStatus::Disabled | _ => {}
39+
impl Error for MyError {
40+
fn provide<'a>(&'a self, request: &mut Request<'a>) {
41+
request.provide_ref(&self.0);
5342
}
54-
};
43+
}
5544
56-
const _: fn(&dyn Error) -> Option<&Backtrace> = |err| err.request_ref::<Backtrace>();
45+
const _: fn(&dyn Error) -> Option<&Backtrace> = |err| error::request_ref::<Backtrace>(err);
5746
"#;
5847

5948
fn main() {

src/backtrace.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ macro_rules! backtrace {
3838
#[cfg(backtrace)]
3939
macro_rules! backtrace_if_absent {
4040
($err:expr) => {
41-
match ($err as &dyn std::error::Error).request_ref::<std::backtrace::Backtrace>() {
41+
match std::error::request_ref::<std::backtrace::Backtrace>($err as &dyn std::error::Error) {
4242
Some(_) => None,
4343
None => backtrace!(),
4444
}

src/context.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use core::convert::Infallible;
44
use core::fmt::{self, Debug, Display, Write};
55

66
#[cfg(backtrace)]
7-
use std::any::{Demand, Provider};
7+
use std::error::Request;
88

99
mod ext {
1010
use super::*;
@@ -144,8 +144,8 @@ where
144144
}
145145

146146
#[cfg(backtrace)]
147-
fn provide<'a>(&'a self, demand: &mut Demand<'a>) {
148-
StdError::provide(&self.error, demand);
147+
fn provide<'a>(&'a self, request: &mut Request<'a>) {
148+
StdError::provide(&self.error, request);
149149
}
150150
}
151151

@@ -158,8 +158,8 @@ where
158158
}
159159

160160
#[cfg(backtrace)]
161-
fn provide<'a>(&'a self, demand: &mut Demand<'a>) {
162-
Provider::provide(&self.error, demand);
161+
fn provide<'a>(&'a self, request: &mut Request<'a>) {
162+
Error::provide(&self.error, request);
163163
}
164164
}
165165

src/error.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ use crate::ptr::Mut;
55
use crate::ptr::{Own, Ref};
66
use crate::{Error, StdError};
77
use alloc::boxed::Box;
8-
#[cfg(backtrace)]
9-
use core::any::Demand;
108
use core::any::TypeId;
119
use core::fmt::{self, Debug, Display};
1210
use core::mem::ManuallyDrop;
1311
#[cfg(not(anyhow_no_ptr_addr_of))]
1412
use core::ptr;
1513
use core::ptr::NonNull;
14+
#[cfg(backtrace)]
15+
use std::error::{self, Request};
1616

1717
#[cfg(feature = "std")]
1818
use core::ops::{Deref, DerefMut};
@@ -522,17 +522,21 @@ impl Error {
522522
Some(addr.cast::<E>().deref_mut())
523523
}
524524
}
525-
}
526525

527-
#[cfg(backtrace)]
528-
impl std::any::Provider for Error {
526+
#[cfg(backtrace)]
527+
pub(crate) fn provide<'a>(&'a self, request: &mut Request<'a>) {
528+
unsafe { ErrorImpl::provide(self.inner.by_ref(), request) }
529+
}
530+
529531
// Called by thiserror when you have `#[source] anyhow::Error`. This provide
530532
// implementation includes the anyhow::Error's Backtrace if any, unlike
531533
// deref'ing to dyn Error where the provide implementation would include
532534
// only the original error's Backtrace from before it got wrapped into an
533535
// anyhow::Error.
534-
fn provide<'a>(&'a self, demand: &mut Demand<'a>) {
535-
unsafe { ErrorImpl::provide(self.inner.by_ref(), demand) }
536+
#[cfg(backtrace)]
537+
#[doc(hidden)]
538+
pub fn thiserror_provide<'a>(&'a self, request: &mut Request<'a>) {
539+
Self::provide(self, request);
536540
}
537541
}
538542

@@ -900,19 +904,19 @@ impl ErrorImpl {
900904
.as_ref()
901905
.or_else(|| {
902906
#[cfg(backtrace)]
903-
return Self::error(this).request_ref::<Backtrace>();
907+
return error::request_ref::<Backtrace>(Self::error(this));
904908
#[cfg(not(backtrace))]
905909
return (vtable(this.ptr).object_backtrace)(this);
906910
})
907911
.expect("backtrace capture failed")
908912
}
909913

910914
#[cfg(backtrace)]
911-
unsafe fn provide<'a>(this: Ref<'a, Self>, demand: &mut Demand<'a>) {
915+
unsafe fn provide<'a>(this: Ref<'a, Self>, request: &mut Request<'a>) {
912916
if let Some(backtrace) = &this.deref().backtrace {
913-
demand.provide_ref(backtrace);
917+
request.provide_ref(backtrace);
914918
}
915-
Self::error(this).provide(demand);
919+
Self::error(this).provide(request);
916920
}
917921

918922
#[cold]
@@ -930,8 +934,8 @@ where
930934
}
931935

932936
#[cfg(backtrace)]
933-
fn provide<'a>(&'a self, demand: &mut Demand<'a>) {
934-
unsafe { ErrorImpl::provide(self.erase(), demand) }
937+
fn provide<'a>(&'a self, request: &mut Request<'a>) {
938+
unsafe { ErrorImpl::provide(self.erase(), request) }
935939
}
936940
}
937941

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@
211211
//! non-Anyhow error type inside a function that returns Anyhow's error type.
212212
213213
#![doc(html_root_url = "https://docs.rs/anyhow/1.0.72")]
214-
#![cfg_attr(backtrace, feature(error_generic_member_access, provide_any))]
214+
#![cfg_attr(backtrace, feature(error_generic_member_access))]
215215
#![cfg_attr(doc_cfg, feature(doc_cfg))]
216216
#![cfg_attr(not(feature = "std"), no_std)]
217217
#![deny(dead_code, unused_imports, unused_mut)]

src/wrapper.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::StdError;
22
use core::fmt::{self, Debug, Display};
33

44
#[cfg(backtrace)]
5-
use std::any::Demand;
5+
use std::error::Request;
66

77
#[repr(transparent)]
88
pub struct MessageError<M>(pub M);
@@ -75,7 +75,7 @@ impl StdError for BoxedError {
7575
}
7676

7777
#[cfg(backtrace)]
78-
fn provide<'a>(&'a self, demand: &mut Demand<'a>) {
79-
self.0.provide(demand);
78+
fn provide<'a>(&'a self, request: &mut Request<'a>) {
79+
self.0.provide(request);
8080
}
8181
}

0 commit comments

Comments
 (0)