|  | //@ 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 instruction to make sure we do not match against `trap` | 
|  | // elsewhere in the code. | 
|  | // CHECK-NEXT: ret i8 poison | 
|  | #[no_mangle] | 
|  | fn into_error(self, error: Self::Source) -> Error { | 
|  | Error::Api { source: 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; | 
|  | } |