// Copyright Kani Contributors // SPDX-License-Identifier: Apache-2.0 OR MIT // kani-flags: --default-unwind 3 //! This test case checks the usage of dyn Trait. use std::mem::size_of_val; trait Wrapper { fn inner(&self) -> &T; } struct Concrete<'a, T: ?Sized> { inner: &'a T, } impl Wrapper for Concrete<'_, T> { fn inner(&self) -> &T { self.inner } } #[cfg_attr(kani, kani::proof)] fn check_val() { let val = 20; let inner: Concrete = Concrete { inner: &val }; let trait_inner: &dyn Wrapper = &inner; let original: Concrete> = Concrete { inner: trait_inner }; let wrapper = &original as &dyn Wrapper>; assert_eq!(*wrapper.inner().inner(), val); } #[cfg_attr(kani, kani::proof)] fn check_size() { let val = 10u8; let inner: Concrete = Concrete { inner: &val }; let trait_inner: &dyn Wrapper = &inner; let original: Concrete> = Concrete { inner: trait_inner }; let wrapper = &original as &dyn Wrapper>; assert_eq!(size_of_val(wrapper), 16); assert_eq!(size_of_val(&wrapper.inner()), 16); assert_eq!(size_of_val(wrapper.inner()), 8); } // For easy comparison, this allow us to run with rustc. fn main() { check_val(); check_size(); }