41 lines
1.0 KiB
Rust
41 lines
1.0 KiB
Rust
|
|
#![feature(error_generic_member_access, provide_any)]
|
|
|
|
use std::any::{Demand, Provider};
|
|
use std::backtrace::{Backtrace, BacktraceStatus};
|
|
use std::error::Error;
|
|
use std::fmt::{self, Display};
|
|
|
|
#[derive(Debug)]
|
|
struct E {
|
|
backtrace: Backtrace,
|
|
}
|
|
|
|
impl Display for E {
|
|
fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
unimplemented!()
|
|
}
|
|
}
|
|
|
|
impl Error for E {
|
|
fn provide<'a>(&'a self, demand: &mut Demand<'a>) {
|
|
demand.provide_ref(&self.backtrace);
|
|
}
|
|
}
|
|
|
|
struct P;
|
|
|
|
impl Provider for P {
|
|
fn provide<'a>(&'a self, _demand: &mut Demand<'a>) {}
|
|
}
|
|
|
|
const _: fn() = || {
|
|
let backtrace: Backtrace = Backtrace::capture();
|
|
let status: BacktraceStatus = backtrace.status();
|
|
match status {
|
|
BacktraceStatus::Captured | BacktraceStatus::Disabled | _ => {}
|
|
}
|
|
};
|
|
|
|
const _: fn(&dyn Error) -> Option<&Backtrace> = |err| err.request_ref::<Backtrace>();
|