Skip to content

Commit 8277ec4

Browse files
authored
Merge pull request #372 from dtolnay/stdbacktrace
Access Backtrace exclusively through ::thiserror
2 parents d14adfb + d6d896d commit 8277ec4

File tree

3 files changed

+37
-10
lines changed

3 files changed

+37
-10
lines changed

build.rs

+24
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ use std::io::ErrorKind;
55
use std::iter;
66
use std::path::Path;
77
use std::process::{self, Command, Stdio};
8+
use std::str;
89

910
fn main() {
1011
println!("cargo:rerun-if-changed=build/probe.rs");
1112

1213
println!("cargo:rustc-check-cfg=cfg(error_generic_member_access)");
1314
println!("cargo:rustc-check-cfg=cfg(thiserror_nightly_testing)");
15+
println!("cargo:rustc-check-cfg=cfg(thiserror_no_backtrace_type)");
1416

1517
let error_generic_member_access;
1618
let consider_rustc_bootstrap;
@@ -54,6 +56,17 @@ fn main() {
5456
if consider_rustc_bootstrap {
5557
println!("cargo:rerun-if-env-changed=RUSTC_BOOTSTRAP");
5658
}
59+
60+
let rustc = match rustc_minor_version() {
61+
Some(rustc) => rustc,
62+
None => return,
63+
};
64+
65+
// std::backtrace::Backtrace stabilized in Rust 1.65
66+
// https://blog.rust-lang.org/2022/11/03/Rust-1.65.0.html#stabilized-apis
67+
if rustc < 65 {
68+
println!("cargo:rustc-cfg=thiserror_no_backtrace_type");
69+
}
5770
}
5871

5972
fn compile_probe(rustc_bootstrap: bool) -> bool {
@@ -135,6 +148,17 @@ fn compile_probe(rustc_bootstrap: bool) -> bool {
135148
success
136149
}
137150

151+
fn rustc_minor_version() -> Option<u32> {
152+
let rustc = cargo_env_var("RUSTC");
153+
let output = Command::new(rustc).arg("--version").output().ok()?;
154+
let version = str::from_utf8(&output.stdout).ok()?;
155+
let mut pieces = version.split('.');
156+
if pieces.next() != Some("rustc 1") {
157+
return None;
158+
}
159+
pieces.next()?.parse().ok()
160+
}
161+
138162
fn cargo_env_var(key: &str) -> OsString {
139163
env::var_os(key).unwrap_or_else(|| {
140164
eprintln!("Environment variable ${key} is not set during execution of build script");

impl/src/expand.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,12 @@ fn impl_struct(input: Struct) -> TokenStream {
118118
} else if type_is_option(backtrace_field.ty) {
119119
Some(quote! {
120120
if let ::core::option::Option::Some(backtrace) = &self.#backtrace {
121-
#request.provide_ref::<::std::backtrace::Backtrace>(backtrace);
121+
#request.provide_ref::<::thiserror::__private::Backtrace>(backtrace);
122122
}
123123
})
124124
} else {
125125
Some(quote! {
126-
#request.provide_ref::<::std::backtrace::Backtrace>(&self.#backtrace);
126+
#request.provide_ref::<::thiserror::__private::Backtrace>(&self.#backtrace);
127127
})
128128
};
129129
quote! {
@@ -134,12 +134,12 @@ fn impl_struct(input: Struct) -> TokenStream {
134134
} else if type_is_option(backtrace_field.ty) {
135135
quote! {
136136
if let ::core::option::Option::Some(backtrace) = &self.#backtrace {
137-
#request.provide_ref::<::std::backtrace::Backtrace>(backtrace);
137+
#request.provide_ref::<::thiserror::__private::Backtrace>(backtrace);
138138
}
139139
}
140140
} else {
141141
quote! {
142-
#request.provide_ref::<::std::backtrace::Backtrace>(&self.#backtrace);
142+
#request.provide_ref::<::thiserror::__private::Backtrace>(&self.#backtrace);
143143
}
144144
};
145145
quote! {
@@ -309,12 +309,12 @@ fn impl_enum(input: Enum) -> TokenStream {
309309
let self_provide = if type_is_option(backtrace_field.ty) {
310310
quote! {
311311
if let ::core::option::Option::Some(backtrace) = backtrace {
312-
#request.provide_ref::<::std::backtrace::Backtrace>(backtrace);
312+
#request.provide_ref::<::thiserror::__private::Backtrace>(backtrace);
313313
}
314314
}
315315
} else {
316316
quote! {
317-
#request.provide_ref::<::std::backtrace::Backtrace>(backtrace);
317+
#request.provide_ref::<::thiserror::__private::Backtrace>(backtrace);
318318
}
319319
};
320320
quote! {
@@ -357,12 +357,12 @@ fn impl_enum(input: Enum) -> TokenStream {
357357
let body = if type_is_option(backtrace_field.ty) {
358358
quote! {
359359
if let ::core::option::Option::Some(backtrace) = backtrace {
360-
#request.provide_ref::<::std::backtrace::Backtrace>(backtrace);
360+
#request.provide_ref::<::thiserror::__private::Backtrace>(backtrace);
361361
}
362362
}
363363
} else {
364364
quote! {
365-
#request.provide_ref::<::std::backtrace::Backtrace>(backtrace);
365+
#request.provide_ref::<::thiserror::__private::Backtrace>(backtrace);
366366
}
367367
};
368368
quote! {
@@ -532,11 +532,11 @@ fn from_initializer(
532532
let backtrace_member = &backtrace_field.member;
533533
if type_is_option(backtrace_field.ty) {
534534
quote! {
535-
#backtrace_member: ::core::option::Option::Some(::std::backtrace::Backtrace::capture()),
535+
#backtrace_member: ::core::option::Option::Some(::thiserror::__private::Backtrace::capture()),
536536
}
537537
} else {
538538
quote! {
539-
#backtrace_member: ::core::convert::From::from(::std::backtrace::Backtrace::capture()),
539+
#backtrace_member: ::core::convert::From::from(::thiserror::__private::Backtrace::capture()),
540540
}
541541
}
542542
});

src/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,9 @@ pub mod __private {
287287
#[cfg(error_generic_member_access)]
288288
#[doc(hidden)]
289289
pub use crate::provide::ThiserrorProvide;
290+
#[cfg(not(thiserror_no_backtrace_type))]
291+
#[doc(hidden)]
292+
pub use std::backtrace::Backtrace;
290293
#[doc(hidden)]
291294
pub use std::error::Error;
292295
}

0 commit comments

Comments
 (0)