use super::super::prelude::*; use core::clone::Clone; verus! { #[verifier::external_trait_specification] pub trait ExClone: Sized { type ExternalTraitSpecificationFor: core::clone::Clone; fn clone(&self) -> Self; } #[verifier::external_trait_specification] pub trait ExCopy: Clone { type ExternalTraitSpecificationFor: core::marker::Copy; } /* #[verifier::external_fn_specification] pub fn ex_clone_clone_from(a: &mut T, b: &T) { a.clone_from(b) } */ pub assume_specification[ ::clone ](b: &bool) -> (res: bool) returns b, ; pub assume_specification[ ::clone ](c: &char) -> (res: char) returns c, ; #[allow(suspicious_double_ref_op)] pub assume_specification<'b, T: core::marker::PointeeSized, 'a>[ <&'b T as Clone>::clone ]( b: &'a &'b T, ) -> (res: &'b T) ensures res == b, ; pub assume_specification[ <[T; N] as Clone>::clone ](a: &[T; N]) -> (res: [T; N]) ensures forall|i| #![all_triggers] 0 <= i < N ==> cloned::(a@[i], res@[i]), a@ =~= res@ ==> a@ == res@, ; /* #[verifier::external_fn_specification] pub fn ex_bool_clone_from(dest: &mut bool, source: &bool) ensures *dest == source, { dest.clone_from(source) } */ // Cloning a Tracked copies the underlying ghost T pub assume_specification[ as Clone>::clone ](b: &Tracked) -> (res: Tracked< T, >) ensures res == b, ; pub assume_specification[ as Clone>::clone ](b: &Ghost) -> (res: Ghost) ensures res == b, ; } // verus!