Merge commit '6eba9cd92c295c5389944f6adda1f1e83b2cb008' as 'subprojects/thiserror'

This commit is contained in:
John Turner
2025-11-15 20:18:36 +00:00
118 changed files with 6352 additions and 0 deletions

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 one of: string literal, `transparent`, `fmt`
--> 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,7 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error("{_}")]
pub struct Error;
fn main() {}

View File

@@ -0,0 +1,7 @@
error: invalid format string: invalid argument name `_`
--> tests/ui/display-underscore.rs:4:11
|
4 | #[error("{_}")]
| ^ invalid argument name in format string
|
= note: argument name cannot be a single underscore

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,23 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error("...")]
#[error("...")]
pub struct Error;
#[derive(Error, Debug)]
#[error(fmt = core::fmt::Octal::fmt)]
#[error(fmt = core::fmt::LowerHex::fmt)]
pub enum FmtFmt {}
#[derive(Error, Debug)]
#[error(fmt = core::fmt::Octal::fmt)]
#[error(transparent)]
pub enum FmtTransparent {}
#[derive(Error, Debug)]
#[error(fmt = core::fmt::Octal::fmt)]
#[error("...")]
pub enum FmtDisplay {}
fn main() {}

View File

@@ -0,0 +1,23 @@
error: only one #[error(...)] attribute is allowed
--> tests/ui/duplicate-fmt.rs:5:1
|
5 | #[error("...")]
| ^^^^^^^^^^^^^^^
error: duplicate #[error(fmt = ...)] attribute
--> tests/ui/duplicate-fmt.rs:10:1
|
10 | #[error(fmt = core::fmt::LowerHex::fmt)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: cannot have both #[error(transparent)] and #[error(fmt = ...)]
--> tests/ui/duplicate-fmt.rs:14:1
|
14 | #[error(fmt = core::fmt::Octal::fmt)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: cannot have both #[error(fmt = ...)] and a format arguments attribute
--> tests/ui/duplicate-fmt.rs:20:1
|
20 | #[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,7 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error("".yellow)]
pub struct ArgError;
fn main() {}

View File

@@ -0,0 +1,24 @@
error: expected `,`, found `.`
--> tests/ui/expression-fallback.rs:4:11
|
4 | #[error("".yellow)]
| ^ expected `,`
error: argument never used
--> tests/ui/expression-fallback.rs:4:12
|
4 | #[error("".yellow)]
| -- ^^^^^^ argument never used
| |
| formatting specifier missing
|
help: format specifiers use curly braces, consider adding a format specifier
|
4 | #[error("{}".yellow)]
| ++
error[E0425]: cannot find value `yellow` in this scope
--> tests/ui/expression-fallback.rs:4:12
|
4 | #[error("".yellow)]
| ^^^^^^ not found in this scope

View File

@@ -0,0 +1,14 @@
use core::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(Error, Debug)]
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]
| ^^^^^

View File

@@ -0,0 +1,24 @@
use core::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,19 @@
error[E0277]: `MyError` doesn't implement `std::fmt::Display`
--> tests/ui/missing-display.rs:4:10
|
3 | #[derive(Error, Debug)]
| ----- in this derive macro expansion
4 | pub enum MyError {
| ^^^^^^^ unsatisfied trait bound
|
help: the trait `std::fmt::Display` is not implemented for `MyError`
--> tests/ui/missing-display.rs:4:1
|
4 | pub enum MyError {
| ^^^^^^^^^^^^^^^^
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`
= 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,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),
| ^^^^^^^^

View File

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

View File

@@ -0,0 +1,46 @@
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: PointeeSized {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: items from traits can only be used if the trait is implemented and in scope
= note: the following trait defines an item `as_display`, perhaps you need to implement it:
candidate #1: `AsDisplay`
error[E0277]: the trait bound `NoDisplay: Octal` is not satisfied
--> tests/ui/no-display.rs:13:9
|
12 | #[derive(Error, Debug)]
| ----- in this derive macro expansion
13 | #[error("thread: {thread:o}")]
| ^^^^^^^^^^^^^^^^^^^^ unsatisfied trait bound
|
help: the trait `Octal` is not implemented for `NoDisplay`
--> tests/ui/no-display.rs:4:1
|
4 | struct NoDisplay;
| ^^^^^^^^^^^^^^^^
= help: the following other types implement trait `Octal`:
&T
&mut T
NonZero<T>
Saturating<T>
Wrapping<T>
i128
i16
i32
and $N others
= note: required for `&NoDisplay` to implement `Octal`
= note: this error originates in the macro `$crate::format_args` which comes from the expansion of the derive macro `Error` (in Nightly builds, run with -Z macro-backtrace for more info)

View File

@@ -0,0 +1,7 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error("invalid rdo_lookahead_frames {0} (expected < {})", i32::MAX)]
pub struct Error(u32);
fn main() {}

View File

@@ -0,0 +1,5 @@
error: ambiguous reference to positional arguments by number in a tuple struct; change this to a named argument
--> tests/ui/numbered-positional-tuple.rs:4:61
|
4 | #[error("invalid rdo_lookahead_frames {0} (expected < {})", i32::MAX)]
| ^^^^^^^^

View File

@@ -0,0 +1,12 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error("error: {r#fn}")]
pub struct Error {
r#fn: &'static str,
}
fn main() {
let r#fn = "...";
let _ = format!("error: {r#fn}");
}

View File

@@ -0,0 +1,21 @@
error: invalid format string: raw identifiers are not supported
--> tests/ui/raw-identifier.rs:4:18
|
4 | #[error("error: {r#fn}")]
| --^^
| |
| raw identifier used here in format string
| help: remove the `r#`
|
= note: identifiers in format strings can be keywords and don't need to be prefixed with `r#`
error: invalid format string: raw identifiers are not supported
--> tests/ui/raw-identifier.rs:11:30
|
11 | let _ = format!("error: {r#fn}");
| --^^
| |
| raw identifier used here in format string
| help: remove the `r#`
|
= note: identifiers in format strings can be keywords and don't need to be prefixed with `r#`

View File

@@ -0,0 +1,11 @@
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error("failed to open")]
OpenFile(#[from] std::io::Error),
#[error("failed to close")]
CloseFile(#[from] std::io::Error),
}
fn main() {}

View File

@@ -0,0 +1,8 @@
error[E0119]: conflicting implementations of trait `From<std::io::Error>` for type `Error`
--> tests/ui/same-from-type.rs:8:15
|
6 | OpenFile(#[from] std::io::Error),
| ------- first implementation here
7 | #[error("failed to close")]
8 | CloseFile(#[from] std::io::Error),
| ^^^^^^^ conflicting implementation for `Error`

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<'_>` or `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 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: items from traits can only be used if the trait is implemented and in scope
= note: the following trait defines an item `as_dyn_error`, perhaps you need to implement it:
candidate #1: `AsDynError`

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:12
|
4 | pub struct NotError;
| ------------------- doesn't satisfy `NotError: AsDynError<'_>` or `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 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: items from traits can only be used if the trait is implemented and in scope
= note: the following trait defines an item `as_dyn_error`, perhaps you need to implement it:
candidate #1: `AsDynError`

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,20 @@
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 because it doesn't satisfy `NotError: AsDynError<'_>` or `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 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: items from traits can only be used if the trait is implemented and in scope
= note: the following trait defines an item `as_dyn_error`, perhaps you need to implement it:
candidate #1: `AsDynError`

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,20 @@
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:24
|
4 | struct NotError;
| --------------- method `as_dyn_error` not found for this struct because it doesn't satisfy `NotError: AsDynError<'_>` or `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 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: items from traits can only be used if the trait is implemented and in scope
= note: the following trait defines an item `as_dyn_error`, perhaps you need to implement it:
candidate #1: `AsDynError`

View File

@@ -0,0 +1,7 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error(fmt = core::fmt::Octal::fmt)]
pub struct Error(i32);
fn main() {}

View File

@@ -0,0 +1,5 @@
error: #[error(fmt = ...)] is only supported in enums; for a struct, handwrite your own Display impl
--> tests/ui/struct-with-fmt.rs:4:1
|
4 | #[error(fmt = core::fmt::Octal::fmt)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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,20 @@
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<'_>` or `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,20 @@
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<'_>` or `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,18 @@
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<'_>` or `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,18 @@
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<'_>` or `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,9 @@
use thiserror::Error;
#[derive(Error, Debug)]
#[error("{self}")]
pub struct Error;
fn main() {
__FAIL__;
}

View File

@@ -0,0 +1,21 @@
error[E0425]: cannot find value `__FAIL__` in this scope
--> tests/ui/unconditional-recursion.rs:8:5
|
8 | __FAIL__;
| ^^^^^^^^ not found in this scope
warning: function cannot return without recursing
--> tests/ui/unconditional-recursion.rs:4:9
|
4 | #[error("{self}")]
| ^^^^^^^^
| |
| cannot return without recursing
| recursive call site
|
= help: a `loop` may express intention better if this is on purpose
note: the lint level is defined here
--> tests/ui/unconditional-recursion.rs:4:9
|
4 | #[error("{self}")]
| ^^^^^^^^

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]
| ^^^^^^^^^

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 | | }
| |_^