use super::super::prelude::*; use core::convert::Infallible; use core::ops::ControlFlow; use core::ops::FromResidual; use core::ops::Try; verus! { #[verifier::external_type_specification] #[verifier::accept_recursive_types(B)] #[verifier::reject_recursive_types_in_ground_variants(C)] pub struct ExControlFlow(ControlFlow); #[verifier::external_type_specification] #[verifier::external_body] pub struct ExInfallible(Infallible); pub assume_specification[ Result::::branch ](result: Result) -> (cf: ControlFlow< as Try>::Residual, as Try>::Output, >) ensures cf == match result { Ok(v) => ControlFlow::Continue(v), Err(e) => ControlFlow::Break(Err(e)), }, no_unwind ; pub assume_specification[ Option::::branch ](option: Option) -> (cf: ControlFlow< as Try>::Residual, as Try>::Output, >) ensures cf == match option { Some(v) => ControlFlow::Continue(v), None => ControlFlow::Break(None), }, no_unwind ; pub assume_specification[ Option::::from_residual ](option: Option) -> (option2: Option) ensures option.is_none(), option2.is_none(), no_unwind ; pub uninterp spec fn spec_from(value: T, ret: S) -> bool; pub broadcast proof fn spec_from_blanket_identity(t: T, s: T) ensures #[trigger] spec_from::(t, s) ==> t == s, { admit(); } pub assume_specification>[ Result::::from_residual ]( result: Result, ) -> (result2: Result) ensures match (result, result2) { (Err(e), Err(e2)) => spec_from::(e, e2) && call_ensures(F::from, (e,), e2), _ => false, }, ; pub broadcast group group_control_flow_axioms { spec_from_blanket_identity, } } // verus!