Initial vendor packages

Signed-off-by: Valentin Popov <valentin@popov.link>
This commit is contained in:
2024-01-08 01:21:28 +04:00
parent 5ecd8cf2cb
commit 1b6a04ca55
7309 changed files with 2160054 additions and 0 deletions

7
vendor/thiserror/tests/compiletest.rs vendored Normal file
View File

@ -0,0 +1,7 @@
#[rustversion::attr(not(nightly), ignore)]
#[cfg_attr(miri, ignore)]
#[test]
fn ui() {
let t = trybuild::TestCases::new();
t.compile_fail("tests/ui/*.rs");
}

274
vendor/thiserror/tests/test_backtrace.rs vendored Normal file
View File

@ -0,0 +1,274 @@
#![cfg_attr(thiserror_nightly_testing, feature(error_generic_member_access))]
use thiserror::Error;
#[derive(Error, Debug)]
#[error("...")]
pub struct Inner;
#[cfg(thiserror_nightly_testing)]
#[derive(Error, Debug)]
#[error("...")]
pub struct InnerBacktrace {
backtrace: std::backtrace::Backtrace,
}
#[cfg(thiserror_nightly_testing)]
pub mod structs {
use super::{Inner, InnerBacktrace};
use std::backtrace::Backtrace;
use std::error::{self, Error};
use std::sync::Arc;
use thiserror::Error;
#[derive(Error, Debug)]
#[error("...")]
pub struct PlainBacktrace {
backtrace: Backtrace,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct ExplicitBacktrace {
#[backtrace]
backtrace: Backtrace,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct OptBacktrace {
#[backtrace]
backtrace: Option<Backtrace>,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct ArcBacktrace {
#[backtrace]
backtrace: Arc<Backtrace>,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct BacktraceFrom {
#[from]
source: Inner,
#[backtrace]
backtrace: Backtrace,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct CombinedBacktraceFrom {
#[from]
#[backtrace]
source: InnerBacktrace,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct OptBacktraceFrom {
#[from]
source: Inner,
#[backtrace]
backtrace: Option<Backtrace>,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct ArcBacktraceFrom {
#[from]
source: Inner,
#[backtrace]
backtrace: Arc<Backtrace>,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct AnyhowBacktrace {
#[backtrace]
source: anyhow::Error,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct BoxDynErrorBacktrace {
#[backtrace]
source: Box<dyn Error>,
}
#[test]
fn test_backtrace() {
let error = PlainBacktrace {
backtrace: Backtrace::capture(),
};
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = ExplicitBacktrace {
backtrace: Backtrace::capture(),
};
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = OptBacktrace {
backtrace: Some(Backtrace::capture()),
};
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = ArcBacktrace {
backtrace: Arc::new(Backtrace::capture()),
};
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = BacktraceFrom::from(Inner);
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = CombinedBacktraceFrom::from(InnerBacktrace {
backtrace: Backtrace::capture(),
});
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = OptBacktraceFrom::from(Inner);
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = ArcBacktraceFrom::from(Inner);
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = AnyhowBacktrace {
source: anyhow::Error::msg("..."),
};
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = BoxDynErrorBacktrace {
source: Box::new(PlainBacktrace {
backtrace: Backtrace::capture(),
}),
};
assert!(error::request_ref::<Backtrace>(&error).is_some());
}
}
#[cfg(thiserror_nightly_testing)]
pub mod enums {
use super::{Inner, InnerBacktrace};
use std::backtrace::Backtrace;
use std::error;
use std::sync::Arc;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum PlainBacktrace {
#[error("...")]
Test { backtrace: Backtrace },
}
#[derive(Error, Debug)]
pub enum ExplicitBacktrace {
#[error("...")]
Test {
#[backtrace]
backtrace: Backtrace,
},
}
#[derive(Error, Debug)]
pub enum OptBacktrace {
#[error("...")]
Test {
#[backtrace]
backtrace: Option<Backtrace>,
},
}
#[derive(Error, Debug)]
pub enum ArcBacktrace {
#[error("...")]
Test {
#[backtrace]
backtrace: Arc<Backtrace>,
},
}
#[derive(Error, Debug)]
pub enum BacktraceFrom {
#[error("...")]
Test {
#[from]
source: Inner,
#[backtrace]
backtrace: Backtrace,
},
}
#[derive(Error, Debug)]
pub enum CombinedBacktraceFrom {
#[error("...")]
Test {
#[from]
#[backtrace]
source: InnerBacktrace,
},
}
#[derive(Error, Debug)]
pub enum OptBacktraceFrom {
#[error("...")]
Test {
#[from]
source: Inner,
#[backtrace]
backtrace: Option<Backtrace>,
},
}
#[derive(Error, Debug)]
pub enum ArcBacktraceFrom {
#[error("...")]
Test {
#[from]
source: Inner,
#[backtrace]
backtrace: Arc<Backtrace>,
},
}
#[test]
fn test_backtrace() {
let error = PlainBacktrace::Test {
backtrace: Backtrace::capture(),
};
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = ExplicitBacktrace::Test {
backtrace: Backtrace::capture(),
};
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = OptBacktrace::Test {
backtrace: Some(Backtrace::capture()),
};
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = ArcBacktrace::Test {
backtrace: Arc::new(Backtrace::capture()),
};
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = BacktraceFrom::from(Inner);
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = CombinedBacktraceFrom::from(InnerBacktrace {
backtrace: Backtrace::capture(),
});
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = OptBacktraceFrom::from(Inner);
assert!(error::request_ref::<Backtrace>(&error).is_some());
let error = ArcBacktraceFrom::from(Inner);
assert!(error::request_ref::<Backtrace>(&error).is_some());
}
}
#[test]
#[cfg_attr(not(thiserror_nightly_testing), ignore)]
fn test_backtrace() {}

View File

@ -0,0 +1,10 @@
#![deny(deprecated, clippy::all, clippy::pedantic)]
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[deprecated]
#[error("...")]
Deprecated,
}

303
vendor/thiserror/tests/test_display.rs vendored Normal file
View File

@ -0,0 +1,303 @@
#![allow(clippy::uninlined_format_args)]
use std::fmt::{self, Display};
use thiserror::Error;
fn assert<T: Display>(expected: &str, value: T) {
assert_eq!(expected, value.to_string());
}
#[test]
fn test_braced() {
#[derive(Error, Debug)]
#[error("braced error: {msg}")]
struct Error {
msg: String,
}
let msg = "T".to_owned();
assert("braced error: T", Error { msg });
}
#[test]
fn test_braced_unused() {
#[derive(Error, Debug)]
#[error("braced error")]
struct Error {
extra: usize,
}
assert("braced error", Error { extra: 0 });
}
#[test]
fn test_tuple() {
#[derive(Error, Debug)]
#[error("tuple error: {0}")]
struct Error(usize);
assert("tuple error: 0", Error(0));
}
#[test]
fn test_unit() {
#[derive(Error, Debug)]
#[error("unit error")]
struct Error;
assert("unit error", Error);
}
#[test]
fn test_enum() {
#[derive(Error, Debug)]
enum Error {
#[error("braced error: {id}")]
Braced { id: usize },
#[error("tuple error: {0}")]
Tuple(usize),
#[error("unit error")]
Unit,
}
assert("braced error: 0", Error::Braced { id: 0 });
assert("tuple error: 0", Error::Tuple(0));
assert("unit error", Error::Unit);
}
#[test]
fn test_constants() {
#[derive(Error, Debug)]
#[error("{MSG}: {id:?} (code {CODE:?})")]
struct Error {
id: &'static str,
}
const MSG: &str = "failed to do";
const CODE: usize = 9;
assert("failed to do: \"\" (code 9)", Error { id: "" });
}
#[test]
fn test_inherit() {
#[derive(Error, Debug)]
#[error("{0}")]
enum Error {
Some(&'static str),
#[error("other error")]
Other(&'static str),
}
assert("some error", Error::Some("some error"));
assert("other error", Error::Other("..."));
}
#[test]
fn test_brace_escape() {
#[derive(Error, Debug)]
#[error("fn main() {{}}")]
struct Error;
assert("fn main() {}", Error);
}
#[test]
fn test_expr() {
#[derive(Error, Debug)]
#[error("1 + 1 = {}", 1 + 1)]
struct Error;
assert("1 + 1 = 2", Error);
}
#[test]
fn test_nested() {
#[derive(Error, Debug)]
#[error("!bool = {}", not(.0))]
struct Error(bool);
#[allow(clippy::trivially_copy_pass_by_ref)]
fn not(bool: &bool) -> bool {
!*bool
}
assert("!bool = false", Error(true));
}
#[test]
fn test_match() {
#[derive(Error, Debug)]
#[error("{}: {0}", match .1 {
Some(n) => format!("error occurred with {}", n),
None => "there was an empty error".to_owned(),
})]
struct Error(String, Option<usize>);
assert(
"error occurred with 1: ...",
Error("...".to_owned(), Some(1)),
);
assert(
"there was an empty error: ...",
Error("...".to_owned(), None),
);
}
#[test]
fn test_nested_display() {
// Same behavior as the one in `test_match`, but without String allocations.
#[derive(Error, Debug)]
#[error("{}", {
struct Msg<'a>(&'a String, &'a Option<usize>);
impl<'a> Display for Msg<'a> {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
match self.1 {
Some(n) => write!(formatter, "error occurred with {}", n),
None => write!(formatter, "there was an empty error"),
}?;
write!(formatter, ": {}", self.0)
}
}
Msg(.0, .1)
})]
struct Error(String, Option<usize>);
assert(
"error occurred with 1: ...",
Error("...".to_owned(), Some(1)),
);
assert(
"there was an empty error: ...",
Error("...".to_owned(), None),
);
}
#[test]
fn test_void() {
#[allow(clippy::empty_enum)]
#[derive(Error, Debug)]
#[error("...")]
pub enum Error {}
let _: Error;
}
#[test]
fn test_mixed() {
#[derive(Error, Debug)]
#[error("a={a} :: b={} :: c={c} :: d={d}", 1, c = 2, d = 3)]
struct Error {
a: usize,
d: usize,
}
assert("a=0 :: b=1 :: c=2 :: d=3", Error { a: 0, d: 0 });
}
#[test]
fn test_ints() {
#[derive(Error, Debug)]
enum Error {
#[error("error {0}")]
Tuple(usize, usize),
#[error("error {0}", '?')]
Struct { v: usize },
}
assert("error 9", Error::Tuple(9, 0));
assert("error ?", Error::Struct { v: 0 });
}
#[test]
fn test_trailing_comma() {
#[derive(Error, Debug)]
#[error(
"error {0}",
)]
#[rustfmt::skip]
struct Error(char);
assert("error ?", Error('?'));
}
#[test]
fn test_field() {
#[derive(Debug)]
struct Inner {
data: usize,
}
#[derive(Error, Debug)]
#[error("{}", .0.data)]
struct Error(Inner);
assert("0", Error(Inner { data: 0 }));
}
#[test]
fn test_macro_rules() {
// Regression test for https://github.com/dtolnay/thiserror/issues/86
macro_rules! decl_error {
($variant:ident($value:ident)) => {
#[derive(Debug, Error)]
pub enum Error0 {
#[error("{0:?}")]
$variant($value),
}
#[derive(Debug, Error)]
#[error("{0:?}")]
pub enum Error1 {
$variant($value),
}
};
}
decl_error!(Repro(u8));
assert("0", Error0::Repro(0));
assert("0", Error1::Repro(0));
}
#[test]
fn test_raw() {
#[derive(Error, Debug)]
#[error("braced raw error: {r#fn}")]
struct Error {
r#fn: &'static str,
}
assert("braced raw error: T", Error { r#fn: "T" });
}
#[test]
fn test_raw_enum() {
#[derive(Error, Debug)]
enum Error {
#[error("braced raw error: {r#fn}")]
Braced { r#fn: &'static str },
}
assert("braced raw error: T", Error::Braced { r#fn: "T" });
}
#[test]
fn test_raw_conflict() {
#[derive(Error, Debug)]
enum Error {
#[error("braced raw error: {r#func}, {func}", func = "U")]
Braced { r#func: &'static str },
}
assert("braced raw error: T, U", Error::Braced { r#func: "T" });
}
#[test]
fn test_keyword() {
#[derive(Error, Debug)]
#[error("error: {type}", type = 1)]
struct Error;
assert("error: 1", Error);
}

56
vendor/thiserror/tests/test_error.rs vendored Normal file
View File

@ -0,0 +1,56 @@
#![allow(dead_code)]
use std::fmt::{self, Display};
use std::io;
use thiserror::Error;
macro_rules! unimplemented_display {
($ty:ty) => {
impl Display for $ty {
fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result {
unimplemented!()
}
}
};
}
#[derive(Error, Debug)]
struct BracedError {
msg: String,
pos: usize,
}
#[derive(Error, Debug)]
struct TupleError(String, usize);
#[derive(Error, Debug)]
struct UnitError;
#[derive(Error, Debug)]
struct WithSource {
#[source]
cause: io::Error,
}
#[derive(Error, Debug)]
struct WithAnyhow {
#[source]
cause: anyhow::Error,
}
#[derive(Error, Debug)]
enum EnumError {
Braced {
#[source]
cause: io::Error,
},
Tuple(#[source] io::Error),
Unit,
}
unimplemented_display!(BracedError);
unimplemented_display!(TupleError);
unimplemented_display!(UnitError);
unimplemented_display!(WithSource);
unimplemented_display!(WithAnyhow);
unimplemented_display!(EnumError);

88
vendor/thiserror/tests/test_expr.rs vendored Normal file
View File

@ -0,0 +1,88 @@
#![allow(clippy::iter_cloned_collect, clippy::uninlined_format_args)]
use std::fmt::Display;
use thiserror::Error;
// Some of the elaborate cases from the rcc codebase, which is a C compiler in
// Rust. https://github.com/jyn514/rcc/blob/0.8.0/src/data/error.rs
#[derive(Error, Debug)]
pub enum CompilerError {
#[error("cannot shift {} by {maximum} or more bits (got {current})", if *.is_left { "left" } else { "right" })]
TooManyShiftBits {
is_left: bool,
maximum: u64,
current: u64,
},
#[error("#error {}", (.0).iter().copied().collect::<Vec<_>>().join(" "))]
User(Vec<&'static str>),
#[error("overflow while parsing {}integer literal",
if let Some(signed) = .is_signed {
if *signed { "signed "} else { "unsigned "}
} else {
""
}
)]
IntegerOverflow { is_signed: Option<bool> },
#[error("overflow while parsing {}integer literal", match .is_signed {
Some(true) => "signed ",
Some(false) => "unsigned ",
None => "",
})]
IntegerOverflow2 { is_signed: Option<bool> },
}
// Examples drawn from Rustup.
#[derive(Error, Debug)]
pub enum RustupError {
#[error(
"toolchain '{name}' does not contain component {component}{}",
.suggestion
.as_ref()
.map_or_else(String::new, |s| format!("; did you mean '{}'?", s)),
)]
UnknownComponent {
name: String,
component: String,
suggestion: Option<String>,
},
}
fn assert<T: Display>(expected: &str, value: T) {
assert_eq!(expected, value.to_string());
}
#[test]
fn test_rcc() {
assert(
"cannot shift left by 32 or more bits (got 50)",
CompilerError::TooManyShiftBits {
is_left: true,
maximum: 32,
current: 50,
},
);
assert("#error A B C", CompilerError::User(vec!["A", "B", "C"]));
assert(
"overflow while parsing signed integer literal",
CompilerError::IntegerOverflow {
is_signed: Some(true),
},
);
}
#[test]
fn test_rustup() {
assert(
"toolchain 'nightly' does not contain component clipy; did you mean 'clippy'?",
RustupError::UnknownComponent {
name: "nightly".to_owned(),
component: "clipy".to_owned(),
suggestion: Some("clippy".to_owned()),
},
);
}

64
vendor/thiserror/tests/test_from.rs vendored Normal file
View File

@ -0,0 +1,64 @@
#![allow(clippy::extra_unused_type_parameters)]
use std::io;
use thiserror::Error;
#[derive(Error, Debug)]
#[error("...")]
pub struct ErrorStruct {
#[from]
source: io::Error,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct ErrorStructOptional {
#[from]
source: Option<io::Error>,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct ErrorTuple(#[from] io::Error);
#[derive(Error, Debug)]
#[error("...")]
pub struct ErrorTupleOptional(#[from] Option<io::Error>);
#[derive(Error, Debug)]
#[error("...")]
pub enum ErrorEnum {
Test {
#[from]
source: io::Error,
},
}
#[derive(Error, Debug)]
#[error("...")]
pub enum ErrorEnumOptional {
Test {
#[from]
source: Option<io::Error>,
},
}
#[derive(Error, Debug)]
#[error("...")]
pub enum Many {
Any(#[from] anyhow::Error),
Io(#[from] io::Error),
}
fn assert_impl<T: From<io::Error>>() {}
#[test]
fn test_from() {
assert_impl::<ErrorStruct>();
assert_impl::<ErrorStructOptional>();
assert_impl::<ErrorTuple>();
assert_impl::<ErrorTupleOptional>();
assert_impl::<ErrorEnum>();
assert_impl::<ErrorEnumOptional>();
assert_impl::<Many>();
}

161
vendor/thiserror/tests/test_generics.rs vendored Normal file
View File

@ -0,0 +1,161 @@
#![allow(clippy::needless_late_init, clippy::uninlined_format_args)]
use std::fmt::{self, Debug, Display};
use thiserror::Error;
pub struct NoFormat;
#[derive(Debug)]
pub struct DebugOnly;
pub struct DisplayOnly;
impl Display for DisplayOnly {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("display only")
}
}
#[derive(Debug)]
pub struct DebugAndDisplay;
impl Display for DebugAndDisplay {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("debug and display")
}
}
// Should expand to:
//
// impl<E> Display for EnumDebugField<E>
// where
// E: Debug;
//
// impl<E> Error for EnumDebugField<E>
// where
// Self: Debug + Display;
//
#[derive(Error, Debug)]
pub enum EnumDebugGeneric<E> {
#[error("{0:?}")]
FatalError(E),
}
// Should expand to:
//
// impl<E> Display for EnumFromGeneric<E>;
//
// impl<E> Error for EnumFromGeneric<E>
// where
// EnumDebugGeneric<E>: Error + 'static,
// Self: Debug + Display;
//
#[derive(Error, Debug)]
pub enum EnumFromGeneric<E> {
#[error("enum from generic")]
Source(#[from] EnumDebugGeneric<E>),
}
// Should expand to:
//
// impl<HasDisplay, HasDebug, HasNeither> Display
// for EnumCompound<HasDisplay, HasDebug, HasNeither>
// where
// HasDisplay: Display,
// HasDebug: Debug;
//
// impl<HasDisplay, HasDebug, HasNeither> Error
// for EnumCompound<HasDisplay, HasDebug, HasNeither>
// where
// Self: Debug + Display;
//
#[derive(Error)]
pub enum EnumCompound<HasDisplay, HasDebug, HasNeither> {
#[error("{0} {1:?}")]
DisplayDebug(HasDisplay, HasDebug),
#[error("{0}")]
Display(HasDisplay, HasNeither),
#[error("{1:?}")]
Debug(HasNeither, HasDebug),
}
impl<HasDisplay, HasDebug, HasNeither> Debug for EnumCompound<HasDisplay, HasDebug, HasNeither> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str("EnumCompound")
}
}
#[test]
fn test_display_enum_compound() {
let mut instance: EnumCompound<DisplayOnly, DebugOnly, NoFormat>;
instance = EnumCompound::DisplayDebug(DisplayOnly, DebugOnly);
assert_eq!(format!("{}", instance), "display only DebugOnly");
instance = EnumCompound::Display(DisplayOnly, NoFormat);
assert_eq!(format!("{}", instance), "display only");
instance = EnumCompound::Debug(NoFormat, DebugOnly);
assert_eq!(format!("{}", instance), "DebugOnly");
}
// Should expand to:
//
// impl<E> Display for EnumTransparentGeneric<E>
// where
// E: Display;
//
// impl<E> Error for EnumTransparentGeneric<E>
// where
// E: Error,
// Self: Debug + Display;
//
#[derive(Error, Debug)]
pub enum EnumTransparentGeneric<E> {
#[error(transparent)]
Other(E),
}
// Should expand to:
//
// impl<E> Display for StructDebugGeneric<E>
// where
// E: Debug;
//
// impl<E> Error for StructDebugGeneric<E>
// where
// Self: Debug + Display;
//
#[derive(Error, Debug)]
#[error("{underlying:?}")]
pub struct StructDebugGeneric<E> {
pub underlying: E,
}
// Should expand to:
//
// impl<E> Error for StructFromGeneric<E>
// where
// StructDebugGeneric<E>: Error + 'static,
// Self: Debug + Display;
//
#[derive(Error, Debug)]
pub struct StructFromGeneric<E> {
#[from]
pub source: StructDebugGeneric<E>,
}
// Should expand to:
//
// impl<E> Display for StructTransparentGeneric<E>
// where
// E: Display;
//
// impl<E> Error for StructTransparentGeneric<E>
// where
// E: Error,
// Self: Debug + Display;
//
#[derive(Error, Debug)]
#[error(transparent)]
pub struct StructTransparentGeneric<E>(E);

18
vendor/thiserror/tests/test_lints.rs vendored Normal file
View File

@ -0,0 +1,18 @@
use thiserror::Error;
pub use std::error::Error;
#[test]
fn test_unused_qualifications() {
#![deny(unused_qualifications)]
// Expansion of derive(Error) macro can't know whether something like
// std::error::Error is already imported in the caller's scope so it must
// suppress unused_qualifications.
#[derive(Debug, Error)]
#[error("...")]
pub struct MyError;
let _: MyError;
}

105
vendor/thiserror/tests/test_option.rs vendored Normal file
View File

@ -0,0 +1,105 @@
#![cfg_attr(thiserror_nightly_testing, feature(error_generic_member_access))]
#[cfg(thiserror_nightly_testing)]
pub mod structs {
use std::backtrace::Backtrace;
use thiserror::Error;
#[derive(Error, Debug)]
#[error("...")]
pub struct OptSourceNoBacktrace {
#[source]
source: Option<anyhow::Error>,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct OptSourceAlwaysBacktrace {
#[source]
source: Option<anyhow::Error>,
backtrace: Backtrace,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct NoSourceOptBacktrace {
#[backtrace]
backtrace: Option<Backtrace>,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct AlwaysSourceOptBacktrace {
source: anyhow::Error,
#[backtrace]
backtrace: Option<Backtrace>,
}
#[derive(Error, Debug)]
#[error("...")]
pub struct OptSourceOptBacktrace {
#[source]
source: Option<anyhow::Error>,
#[backtrace]
backtrace: Option<Backtrace>,
}
}
#[cfg(thiserror_nightly_testing)]
pub mod enums {
use std::backtrace::Backtrace;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum OptSourceNoBacktrace {
#[error("...")]
Test {
#[source]
source: Option<anyhow::Error>,
},
}
#[derive(Error, Debug)]
pub enum OptSourceAlwaysBacktrace {
#[error("...")]
Test {
#[source]
source: Option<anyhow::Error>,
backtrace: Backtrace,
},
}
#[derive(Error, Debug)]
pub enum NoSourceOptBacktrace {
#[error("...")]
Test {
#[backtrace]
backtrace: Option<Backtrace>,
},
}
#[derive(Error, Debug)]
pub enum AlwaysSourceOptBacktrace {
#[error("...")]
Test {
source: anyhow::Error,
#[backtrace]
backtrace: Option<Backtrace>,
},
}
#[derive(Error, Debug)]
pub enum OptSourceOptBacktrace {
#[error("...")]
Test {
#[source]
source: Option<anyhow::Error>,
#[backtrace]
backtrace: Option<Backtrace>,
},
}
}
#[test]
#[cfg_attr(not(thiserror_nightly_testing), ignore)]
fn test_option() {}

37
vendor/thiserror/tests/test_path.rs vendored Normal file
View File

@ -0,0 +1,37 @@
use ref_cast::RefCast;
use std::fmt::Display;
use std::path::{Path, PathBuf};
use thiserror::Error;
#[derive(Error, Debug)]
#[error("failed to read '{file}'")]
struct StructPathBuf {
file: PathBuf,
}
#[derive(Error, Debug, RefCast)]
#[repr(C)]
#[error("failed to read '{file}'")]
struct StructPath {
file: Path,
}
#[derive(Error, Debug)]
enum EnumPathBuf {
#[error("failed to read '{0}'")]
Read(PathBuf),
}
fn assert<T: Display>(expected: &str, value: T) {
assert_eq!(expected, value.to_string());
}
#[test]
fn test_display() {
let path = Path::new("/thiserror");
let file = path.to_owned();
assert("failed to read '/thiserror'", StructPathBuf { file });
let file = path.to_owned();
assert("failed to read '/thiserror'", EnumPathBuf::Read(file));
assert("failed to read '/thiserror'", StructPath::ref_cast(path));
}

65
vendor/thiserror/tests/test_source.rs vendored Normal file
View File

@ -0,0 +1,65 @@
use std::error::Error as StdError;
use std::io;
use thiserror::Error;
#[derive(Error, Debug)]
#[error("implicit source")]
pub struct ImplicitSource {
source: io::Error,
}
#[derive(Error, Debug)]
#[error("explicit source")]
pub struct ExplicitSource {
source: String,
#[source]
io: io::Error,
}
#[derive(Error, Debug)]
#[error("boxed source")]
pub struct BoxedSource {
#[source]
source: Box<dyn StdError + Send + 'static>,
}
#[test]
fn test_implicit_source() {
let io = io::Error::new(io::ErrorKind::Other, "oh no!");
let error = ImplicitSource { source: io };
error.source().unwrap().downcast_ref::<io::Error>().unwrap();
}
#[test]
fn test_explicit_source() {
let io = io::Error::new(io::ErrorKind::Other, "oh no!");
let error = ExplicitSource {
source: String::new(),
io,
};
error.source().unwrap().downcast_ref::<io::Error>().unwrap();
}
#[test]
fn test_boxed_source() {
let source = Box::new(io::Error::new(io::ErrorKind::Other, "oh no!"));
let error = BoxedSource { source };
error.source().unwrap().downcast_ref::<io::Error>().unwrap();
}
macro_rules! error_from_macro {
($($variants:tt)*) => {
#[derive(Error)]
#[derive(Debug)]
pub enum MacroSource {
$($variants)*
}
}
}
// Test that we generate impls with the proper hygiene
#[rustfmt::skip]
error_from_macro! {
#[error("Something")]
Variant(#[from] io::Error)
}

View File

@ -0,0 +1,78 @@
use anyhow::anyhow;
use std::error::Error as _;
use std::io;
use thiserror::Error;
#[test]
fn test_transparent_struct() {
#[derive(Error, Debug)]
#[error(transparent)]
struct Error(ErrorKind);
#[derive(Error, Debug)]
enum ErrorKind {
#[error("E0")]
E0,
#[error("E1")]
E1(#[from] io::Error),
}
let error = Error(ErrorKind::E0);
assert_eq!("E0", error.to_string());
assert!(error.source().is_none());
let io = io::Error::new(io::ErrorKind::Other, "oh no!");
let error = Error(ErrorKind::from(io));
assert_eq!("E1", error.to_string());
error.source().unwrap().downcast_ref::<io::Error>().unwrap();
}
#[test]
fn test_transparent_enum() {
#[derive(Error, Debug)]
enum Error {
#[error("this failed")]
This,
#[error(transparent)]
Other(anyhow::Error),
}
let error = Error::This;
assert_eq!("this failed", error.to_string());
let error = Error::Other(anyhow!("inner").context("outer"));
assert_eq!("outer", error.to_string());
assert_eq!("inner", error.source().unwrap().to_string());
}
#[test]
fn test_anyhow() {
#[derive(Error, Debug)]
#[error(transparent)]
struct Any(#[from] anyhow::Error);
let error = Any::from(anyhow!("inner").context("outer"));
assert_eq!("outer", error.to_string());
assert_eq!("inner", error.source().unwrap().to_string());
}
#[test]
fn test_non_static() {
#[derive(Error, Debug)]
#[error(transparent)]
struct Error<'a> {
inner: ErrorKind<'a>,
}
#[derive(Error, Debug)]
enum ErrorKind<'a> {
#[error("unexpected token: {:?}", token)]
Unexpected { token: &'a str },
}
let error = Error {
inner: ErrorKind::Unexpected { token: "error" },
};
assert_eq!("unexpected token: \"error\"", error.to_string());
assert!(error.source().is_none());
}

View File

@ -0,0 +1,7 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error(transparent)]
pub struct Error(#[error(transparent)] std::io::Error);
fn main() {}

View File

@ -0,0 +1,5 @@
error: #[error(transparent)] needs to go outside the enum or struct, not on an individual field
--> tests/ui/bad-field-attr.rs:5:18
|
5 | pub struct Error(#[error(transparent)] std::io::Error);
| ^^^^^^^^^^^^^^^^^^^^^

View File

@ -0,0 +1,15 @@
use thiserror::Error;
macro_rules! error_type {
($name:ident, $what:expr) => {
// Use #[error("invalid {}", $what)] instead.
#[derive(Error, Debug)]
#[error(concat!("invalid ", $what))]
pub struct $name;
};
}
error_type!(Error, "foo");
fn main() {}

View File

@ -0,0 +1,10 @@
error: expected string literal
--> tests/ui/concat-display.rs:8:17
|
8 | #[error(concat!("invalid ", $what))]
| ^^^^^^
...
13 | error_type!(Error, "foo");
| ------------------------- in this macro invocation
|
= note: this error originates in the macro `error_type` (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@ -0,0 +1,13 @@
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ErrorEnum {
Confusing {
#[source]
a: std::io::Error,
#[source]
b: anyhow::Error,
},
}
fn main() {}

View File

@ -0,0 +1,5 @@
error: duplicate #[source] attribute
--> tests/ui/duplicate-enum-source.rs:8:9
|
8 | #[source]
| ^^^^^^^^^

View File

@ -0,0 +1,8 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error("...")]
#[error("...")]
pub struct Error;
fn main() {}

View File

@ -0,0 +1,5 @@
error: only one #[error(...)] attribute is allowed
--> tests/ui/duplicate-fmt.rs:5:1
|
5 | #[error("...")]
| ^^^^^^^^^^^^^^^

View File

@ -0,0 +1,11 @@
use thiserror::Error;
#[derive(Error, Debug)]
pub struct ErrorStruct {
#[source]
a: std::io::Error,
#[source]
b: anyhow::Error,
}
fn main() {}

View File

@ -0,0 +1,5 @@
error: duplicate #[source] attribute
--> tests/ui/duplicate-struct-source.rs:7:5
|
7 | #[source]
| ^^^^^^^^^

View File

@ -0,0 +1,8 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error(transparent)]
#[error(transparent)]
pub struct Error(anyhow::Error);
fn main() {}

View File

@ -0,0 +1,5 @@
error: duplicate #[error(transparent)] attribute
--> tests/ui/duplicate-transparent.rs:5:1
|
5 | #[error(transparent)]
| ^^^^^^^^^^^^^^^^^^^^^

View File

@ -0,0 +1,14 @@
use std::fmt::{self, Display};
use thiserror::Error;
#[derive(Error, Debug)]
#[error]
pub struct MyError;
impl Display for MyError {
fn fmt(&self, _formatter: &mut fmt::Formatter) -> fmt::Result {
unimplemented!()
}
}
fn main() {}

View File

@ -0,0 +1,16 @@
error: expected attribute arguments in parentheses: #[error(...)]
--> tests/ui/fallback-impl-with-display.rs:5:3
|
5 | #[error]
| ^^^^^
error[E0119]: conflicting implementations of trait `std::fmt::Display` for type `MyError`
--> tests/ui/fallback-impl-with-display.rs:4:10
|
4 | #[derive(Error, Debug)]
| ^^^^^ conflicting implementation for `MyError`
...
8 | impl Display for MyError {
| ------------------------ first implementation here
|
= note: this error originates in the derive macro `Error` (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@ -0,0 +1,15 @@
// https://github.com/dtolnay/thiserror/issues/163
use std::backtrace::Backtrace;
use thiserror::Error;
#[derive(Error, Debug)]
#[error("...")]
pub struct Error(
#[from]
#[backtrace]
std::io::Error,
Backtrace,
);
fn main() {}

View File

@ -0,0 +1,5 @@
error: deriving From requires no fields other than source and backtrace
--> tests/ui/from-backtrace-backtrace.rs:9:5
|
9 | #[from]
| ^^^^^^^

View File

@ -0,0 +1,11 @@
use thiserror::Error;
#[derive(Debug, Error)]
pub struct Error {
#[source]
source: std::io::Error,
#[from]
other: anyhow::Error,
}
fn main() {}

View File

@ -0,0 +1,5 @@
error: #[from] is only supported on the source field, not any other field
--> tests/ui/from-not-source.rs:7:5
|
7 | #[from]
| ^^^^^^^

View File

@ -0,0 +1,11 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error]
pub struct MyError;
fn main() {
// No error on the following line. Thiserror emits an Error impl despite the
// bad attribute.
_ = &MyError as &dyn std::error::Error;
}

View File

@ -0,0 +1,5 @@
error: expected attribute arguments in parentheses: #[error(...)]
--> tests/ui/invalid-input-impl-anyway.rs:4:3
|
4 | #[error]
| ^^^^^

24
vendor/thiserror/tests/ui/lifetime.rs vendored Normal file
View File

@ -0,0 +1,24 @@
use std::fmt::Debug;
use thiserror::Error;
#[derive(Error, Debug)]
#[error("error")]
struct Error<'a>(#[from] Inner<'a>);
#[derive(Error, Debug)]
#[error("{0}")]
struct Inner<'a>(&'a str);
#[derive(Error, Debug)]
enum Enum<'a> {
#[error("error")]
Foo(#[from] Generic<&'a str>),
}
#[derive(Error, Debug)]
#[error("{0:?}")]
struct Generic<T: Debug>(T);
fn main() -> Result<(), Error<'static>> {
Err(Error(Inner("some text")))
}

View File

@ -0,0 +1,11 @@
error: non-static lifetimes are not allowed in the source of an error, because std::error::Error requires the source is dyn Error + 'static
--> tests/ui/lifetime.rs:6:26
|
6 | struct Error<'a>(#[from] Inner<'a>);
| ^^^^^^^^^
error: non-static lifetimes are not allowed in the source of an error, because std::error::Error requires the source is dyn Error + 'static
--> tests/ui/lifetime.rs:15:17
|
15 | Foo(#[from] Generic<&'a str>),
| ^^^^^^^^^^^^^^^^

View File

@ -0,0 +1,9 @@
use thiserror::Error;
#[derive(Error, Debug)]
pub enum MyError {
First,
Second,
}
fn main() {}

View File

@ -0,0 +1,13 @@
error[E0277]: `MyError` doesn't implement `std::fmt::Display`
--> tests/ui/missing-display.rs:4:10
|
4 | pub enum MyError {
| ^^^^^^^ `MyError` cannot be formatted with the default formatter
|
= help: the trait `std::fmt::Display` is not implemented for `MyError`
= note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) instead
note: required by a bound in `std::error::Error`
--> $RUST/core/src/error.rs
|
| pub trait Error: Debug + Display {
| ^^^^^^^ required by this bound in `Error`

View File

@ -0,0 +1,10 @@
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error("...")]
A(usize),
B(usize),
}
fn main() {}

View File

@ -0,0 +1,5 @@
error: missing #[error("...")] display attribute
--> tests/ui/missing-fmt.rs:7:5
|
7 | B(usize),
| ^^^^^^^^

12
vendor/thiserror/tests/ui/no-display.rs vendored Normal file
View File

@ -0,0 +1,12 @@
use thiserror::Error;
#[derive(Debug)]
struct NoDisplay;
#[derive(Error, Debug)]
#[error("thread: {thread}")]
pub struct Error {
thread: NoDisplay,
}
fn main() {}

View File

@ -0,0 +1,17 @@
error[E0599]: the method `as_display` exists for reference `&NoDisplay`, but its trait bounds were not satisfied
--> tests/ui/no-display.rs:7:9
|
4 | struct NoDisplay;
| ---------------- doesn't satisfy `NoDisplay: std::fmt::Display`
...
7 | #[error("thread: {thread}")]
| ^^^^^^^^^^^^^^^^^^ method cannot be called on `&NoDisplay` due to unsatisfied trait bounds
|
= note: the following trait bounds were not satisfied:
`NoDisplay: std::fmt::Display`
which is required by `&NoDisplay: AsDisplay<'_>`
note: the trait `std::fmt::Display` must be implemented
--> $RUST/core/src/fmt/mod.rs
|
| pub trait Display {
| ^^^^^^^^^^^^^^^^^

View File

@ -0,0 +1,12 @@
use thiserror::Error;
#[derive(Debug)]
pub struct NotError;
#[derive(Error, Debug)]
#[error("...")]
pub enum ErrorEnum {
Broken { source: NotError },
}
fn main() {}

View File

@ -0,0 +1,22 @@
error[E0599]: the method `as_dyn_error` exists for reference `&NotError`, but its trait bounds were not satisfied
--> tests/ui/source-enum-not-error.rs:9:14
|
4 | pub struct NotError;
| -------------------
| |
| doesn't satisfy `NotError: AsDynError<'_>`
| doesn't satisfy `NotError: std::error::Error`
...
9 | Broken { source: NotError },
| ^^^^^^ method cannot be called on `&NotError` due to unsatisfied trait bounds
|
= note: the following trait bounds were not satisfied:
`NotError: std::error::Error`
which is required by `NotError: AsDynError<'_>`
`&NotError: std::error::Error`
which is required by `&NotError: AsDynError<'_>`
note: the trait `std::error::Error` must be implemented
--> $RUST/core/src/error.rs
|
| pub trait Error: Debug + Display {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -0,0 +1,12 @@
use thiserror::Error;
#[derive(Debug)]
pub struct NotError;
#[derive(Error, Debug)]
#[error("...")]
pub enum ErrorEnum {
Broken(#[source] NotError),
}
fn main() {}

View File

@ -0,0 +1,22 @@
error[E0599]: the method `as_dyn_error` exists for reference `&NotError`, but its trait bounds were not satisfied
--> tests/ui/source-enum-unnamed-field-not-error.rs:9:14
|
4 | pub struct NotError;
| -------------------
| |
| doesn't satisfy `NotError: AsDynError<'_>`
| doesn't satisfy `NotError: std::error::Error`
...
9 | Broken(#[source] NotError),
| ^^^^^^ method cannot be called on `&NotError` due to unsatisfied trait bounds
|
= note: the following trait bounds were not satisfied:
`NotError: std::error::Error`
which is required by `NotError: AsDynError<'_>`
`&NotError: std::error::Error`
which is required by `&NotError: AsDynError<'_>`
note: the trait `std::error::Error` must be implemented
--> $RUST/core/src/error.rs
|
| pub trait Error: Debug + Display {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -0,0 +1,12 @@
use thiserror::Error;
#[derive(Debug)]
struct NotError;
#[derive(Error, Debug)]
#[error("...")]
pub struct ErrorStruct {
source: NotError,
}
fn main() {}

View File

@ -0,0 +1,21 @@
error[E0599]: the method `as_dyn_error` exists for struct `NotError`, but its trait bounds were not satisfied
--> tests/ui/source-struct-not-error.rs:9:5
|
4 | struct NotError;
| ---------------
| |
| method `as_dyn_error` not found for this struct
| doesn't satisfy `NotError: AsDynError<'_>`
| doesn't satisfy `NotError: std::error::Error`
...
9 | source: NotError,
| ^^^^^^ method cannot be called on `NotError` due to unsatisfied trait bounds
|
= note: the following trait bounds were not satisfied:
`NotError: std::error::Error`
which is required by `NotError: AsDynError<'_>`
note: the trait `std::error::Error` must be implemented
--> $RUST/core/src/error.rs
|
| pub trait Error: Debug + Display {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -0,0 +1,10 @@
use thiserror::Error;
#[derive(Debug)]
struct NotError;
#[derive(Error, Debug)]
#[error("...")]
pub struct ErrorStruct(#[source] NotError);
fn main() {}

View File

@ -0,0 +1,21 @@
error[E0599]: the method `as_dyn_error` exists for struct `NotError`, but its trait bounds were not satisfied
--> tests/ui/source-struct-unnamed-field-not-error.rs:8:26
|
4 | struct NotError;
| ---------------
| |
| method `as_dyn_error` not found for this struct
| doesn't satisfy `NotError: AsDynError<'_>`
| doesn't satisfy `NotError: std::error::Error`
...
8 | pub struct ErrorStruct(#[source] NotError);
| ^^^^^^ method cannot be called on `NotError` due to unsatisfied trait bounds
|
= note: the following trait bounds were not satisfied:
`NotError: std::error::Error`
which is required by `NotError: AsDynError<'_>`
note: the trait `std::error::Error` must be implemented
--> $RUST/core/src/error.rs
|
| pub trait Error: Debug + Display {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -0,0 +1,8 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error(transparent)]
#[error("...")]
pub struct Error(anyhow::Error);
fn main() {}

View File

@ -0,0 +1,5 @@
error: cannot have both #[error(transparent)] and a display attribute
--> tests/ui/transparent-display.rs:5:1
|
5 | #[error("...")]
| ^^^^^^^^^^^^^^^

View File

@ -0,0 +1,9 @@
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error(transparent)]
Other(anyhow::Error, String),
}
fn main() {}

View File

@ -0,0 +1,6 @@
error: #[error(transparent)] requires exactly one field
--> tests/ui/transparent-enum-many.rs:5:5
|
5 | / #[error(transparent)]
6 | | Other(anyhow::Error, String),
| |________________________________^

View File

@ -0,0 +1,9 @@
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error(transparent)]
Other { message: String },
}
fn main() {}

View File

@ -0,0 +1,23 @@
error[E0599]: the method `as_dyn_error` exists for reference `&String`, but its trait bounds were not satisfied
--> tests/ui/transparent-enum-not-error.rs:5:13
|
5 | #[error(transparent)]
| ^^^^^^^^^^^ method cannot be called on `&String` due to unsatisfied trait bounds
|
::: $RUST/alloc/src/string.rs
|
| pub struct String {
| -----------------
| |
| doesn't satisfy `String: AsDynError<'_>`
| doesn't satisfy `String: std::error::Error`
|
= note: the following trait bounds were not satisfied:
`String: std::error::Error`
which is required by `String: AsDynError<'_>`
`&String: std::error::Error`
which is required by `&String: AsDynError<'_>`
`str: Sized`
which is required by `str: AsDynError<'_>`
`str: std::error::Error`
which is required by `str: AsDynError<'_>`

View File

@ -0,0 +1,9 @@
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error(transparent)]
Other(#[source] anyhow::Error),
}
fn main() {}

View File

@ -0,0 +1,5 @@
error: transparent variant can't contain #[source]
--> tests/ui/transparent-enum-source.rs:6:11
|
6 | Other(#[source] anyhow::Error),
| ^^^^^^^^^

View File

@ -0,0 +1,9 @@
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error(transparent)]
Other(String),
}
fn main() {}

View File

@ -0,0 +1,23 @@
error[E0599]: the method `as_dyn_error` exists for reference `&String`, but its trait bounds were not satisfied
--> tests/ui/transparent-enum-unnamed-field-not-error.rs:5:13
|
5 | #[error(transparent)]
| ^^^^^^^^^^^ method cannot be called on `&String` due to unsatisfied trait bounds
|
::: $RUST/alloc/src/string.rs
|
| pub struct String {
| -----------------
| |
| doesn't satisfy `String: AsDynError<'_>`
| doesn't satisfy `String: std::error::Error`
|
= note: the following trait bounds were not satisfied:
`String: std::error::Error`
which is required by `String: AsDynError<'_>`
`&String: std::error::Error`
which is required by `&String: AsDynError<'_>`
`str: Sized`
which is required by `str: AsDynError<'_>`
`str: std::error::Error`
which is required by `str: AsDynError<'_>`

View File

@ -0,0 +1,10 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error(transparent)]
pub struct Error {
inner: anyhow::Error,
what: String,
}
fn main() {}

View File

@ -0,0 +1,5 @@
error: #[error(transparent)] requires exactly one field
--> tests/ui/transparent-struct-many.rs:4:1
|
4 | #[error(transparent)]
| ^^^^^^^^^^^^^^^^^^^^^

View File

@ -0,0 +1,9 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error(transparent)]
pub struct Error {
message: String,
}
fn main() {}

View File

@ -0,0 +1,21 @@
error[E0599]: the method `as_dyn_error` exists for struct `String`, but its trait bounds were not satisfied
--> tests/ui/transparent-struct-not-error.rs:4:9
|
4 | #[error(transparent)]
| ^^^^^^^^^^^ method cannot be called on `String` due to unsatisfied trait bounds
|
::: $RUST/alloc/src/string.rs
|
| pub struct String {
| -----------------
| |
| doesn't satisfy `String: AsDynError<'_>`
| doesn't satisfy `String: std::error::Error`
|
= note: the following trait bounds were not satisfied:
`String: std::error::Error`
which is required by `String: AsDynError<'_>`
`str: Sized`
which is required by `str: AsDynError<'_>`
`str: std::error::Error`
which is required by `str: AsDynError<'_>`

View File

@ -0,0 +1,7 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error(transparent)]
pub struct Error(#[source] anyhow::Error);
fn main() {}

View File

@ -0,0 +1,5 @@
error: transparent error struct can't contain #[source]
--> tests/ui/transparent-struct-source.rs:5:18
|
5 | pub struct Error(#[source] anyhow::Error);
| ^^^^^^^^^

View File

@ -0,0 +1,7 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error(transparent)]
pub struct Error(String);
fn main() {}

View File

@ -0,0 +1,21 @@
error[E0599]: the method `as_dyn_error` exists for struct `String`, but its trait bounds were not satisfied
--> tests/ui/transparent-struct-unnamed-field-not-error.rs:4:9
|
4 | #[error(transparent)]
| ^^^^^^^^^^^ method cannot be called on `String` due to unsatisfied trait bounds
|
::: $RUST/alloc/src/string.rs
|
| pub struct String {
| -----------------
| |
| doesn't satisfy `String: AsDynError<'_>`
| doesn't satisfy `String: std::error::Error`
|
= note: the following trait bounds were not satisfied:
`String: std::error::Error`
which is required by `String: AsDynError<'_>`
`str: Sized`
which is required by `str: AsDynError<'_>`
`str: std::error::Error`
which is required by `str: AsDynError<'_>`

View File

@ -0,0 +1,11 @@
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
What {
#[error("...")]
io: std::io::Error,
},
}
fn main() {}

View File

@ -0,0 +1,5 @@
error: not expected here; the #[error(...)] attribute belongs on top of a struct or an enum variant
--> tests/ui/unexpected-field-fmt.rs:6:9
|
6 | #[error("...")]
| ^^^^^^^^^^^^^^^

View File

@ -0,0 +1,7 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[source]
pub struct Error;
fn main() {}

View File

@ -0,0 +1,5 @@
error: not expected here; the #[source] attribute belongs on a specific field
--> tests/ui/unexpected-struct-source.rs:4:1
|
4 | #[source]
| ^^^^^^^^^

9
vendor/thiserror/tests/ui/union.rs vendored Normal file
View File

@ -0,0 +1,9 @@
use thiserror::Error;
#[derive(Error)]
pub union U {
msg: &'static str,
num: usize,
}
fn main() {}

View File

@ -0,0 +1,8 @@
error: union as errors are not supported
--> tests/ui/union.rs:4:1
|
4 | / pub union U {
5 | | msg: &'static str,
6 | | num: usize,
7 | | }
| |_^