| // compile-flags: -C opt-level=0 |
| #![crate_type = "lib"] |
| |
| pub enum ApiError {} |
| #[allow(dead_code)] |
| pub struct TokioError { |
| b: bool, |
| } |
| pub enum Error { |
| Api { |
| source: ApiError, |
| }, |
| Ethereum, |
| Tokio { |
| source: TokioError, |
| }, |
| } |
| struct Api; |
| impl IntoError<Error> for Api |
| { |
| type Source = ApiError; |
| // CHECK-LABEL: @into_error |
| // CHECK: llvm.trap() |
| // Also check the next two instructions to make sure we do not match against `trap` |
| // elsewhere in the code. |
| // CHECK-NEXT: load |
| // CHECK-NEXT: ret |
| #[no_mangle] |
| fn into_error(self, error: Self::Source) -> Error { |
| Error::Api { |
| source: (|v| v)(error), |
| } |
| } |
| } |
| |
| pub trait IntoError<E> |
| { |
| /// The underlying error |
| type Source; |
| |
| /// Combine the information to produce the error |
| fn into_error(self, source: Self::Source) -> E; |
| } |