1use crate::prelude::*;
2use core::mem::*;
3
4impl<T> View for MaybeUninit<T> {
5 type ViewTy = Option<T>;
6
7 #[logic(opaque)]
8 fn view(self) -> Option<T> {
9 dead
10 }
11}
12
13extern_spec! {
14 mod core {
15 mod mem {
16 #[check(ghost)]
17 #[ensures(^dest == src)]
18 #[ensures(result == *dest)]
19 fn replace<T>(dest: &mut T, src: T) -> T {
20 let mut src = src;
21 swap(dest, &mut src);
22 src
23 }
24
25 #[check(ghost)]
26 #[ensures(^x == *y)]
27 #[ensures(^y == *x)]
28 fn swap<T>(x: &mut T, y: &mut T);
29
30 #[ensures(result == *dest)]
31 #[ensures(T::default.postcondition((), ^dest))]
32 fn take<T: Default>(dest: &mut T) -> T {
33 replace(dest, T::default())
34 }
35
36 #[check(ghost)]
37 #[ensures(resolve(t))]
38 fn drop<T>(t: T) {}
39
40 #[check(ghost)]
41 #[ensures(resolve(t))]
42 fn forget<T>(t: T) {}
43
44 #[check(terminates)]
47 #[ensures(result@ == size_of_logic::<T>())]
48 fn size_of<T>() -> usize;
49
50 #[check(terminates)]
53 #[ensures(result@ == size_of_val_logic::<T>(*val))]
54 fn size_of_val<T: ?Sized>(val: &T) -> usize;
55
56 #[check(terminates)]
63 #[ensures(result == align_of_logic::<T>())]
64 fn align_of<T>() -> usize;
65 }
66 }
67
68 impl<T> MaybeUninit<T> {
69 #[ensures(result@ == Some(val))]
70 #[check(ghost)]
71 fn new(val: T) -> Self;
72
73 #[ensures(result@ == None)]
74 #[check(ghost)]
75 fn uninit() -> Self;
76
77 #[requires(self@ == None)] #[ensures(*result == val)]
79 #[ensures((^self)@ == Some(^result))]
80 #[check(ghost)]
81 fn write(&mut self, val: T) -> &mut T;
82
83 #[requires(self@ != None)]
84 #[ensures(self@ == Some(result))]
85 #[check(ghost)]
86 const unsafe fn assume_init(self) -> T;
87
88 #[requires(self@ != None)]
89 #[ensures((^self)@ == None)]
90 #[check(ghost)]
91 unsafe fn assume_init_drop(&mut self);
92
93 #[requires(self@ != None)]
94 #[ensures(self@ == Some(*result))]
95 #[check(ghost)]
96 const unsafe fn assume_init_ref(&self) -> &T;
97
98 #[requires(self@ != None)]
99 #[ensures((*self)@ == Some(*result) && (^self)@ == Some(^result))]
100 #[check(ghost)]
101 const unsafe fn assume_init_mut(&mut self) -> &mut T;
102 }
103}
104
105#[trusted]
130#[logic(open, inline)]
131#[intrinsic("size_of_logic")]
132#[ensures(0 <= result)]
133pub fn size_of_logic<T>() -> Int {
134 dead
135}
136
137#[trusted]
139#[logic(open, inline)]
140#[intrinsic("size_of_val_logic")]
141#[ensures(0 <= result)]
142pub fn size_of_val_logic<T: ?Sized>(val: T) -> Int {
143 dead
144}
145
146#[allow(unused)]
147#[logic]
148#[intrinsic("size_of_val_logic_sized")]
149fn size_of_val_logic_sized<T>(_val: T) -> Int {
150 size_of_logic::<T>()
151}
152
153#[allow(unused)]
154#[logic]
155#[intrinsic("size_of_val_logic_slice")]
156fn size_of_val_logic_slice<T>(val: [T]) -> Int {
157 pearlite! { size_of_logic::<T>() * val@.len() }
158}
159
160#[allow(unused)]
161#[logic]
162#[intrinsic("size_of_val_logic_str")]
163fn size_of_val_logic_str(val: str) -> Int {
164 pearlite! { val@.to_bytes().len() }
165}
166
167#[trusted]
171#[logic(open, inline)]
172#[intrinsic("align_of_logic")]
173#[ensures(0usize != result && result & (result - 1usize) == 0usize)]
174#[ensures(size_of_logic::<T>() % result@ == 0)]
175pub fn align_of_logic<T>() -> usize {
176 dead
177}