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]
126#[logic(open, inline)]
127#[intrinsic("size_of_logic")]
128#[ensures(0 <= result)]
129pub fn size_of_logic<T>() -> Int {
130 dead
131}
132
133#[trusted]
135#[logic(open, inline)]
136#[intrinsic("size_of_val_logic")]
137#[ensures(0 <= result)]
138pub fn size_of_val_logic<T: ?Sized>(val: T) -> Int {
139 dead
140}
141
142#[allow(unused)]
143#[logic]
144#[intrinsic("size_of_val_logic_sized")]
145fn size_of_val_logic_sized<T>(_val: T) -> Int {
146 size_of_logic::<T>()
147}
148
149#[allow(unused)]
150#[logic]
151#[intrinsic("size_of_val_logic_slice")]
152fn size_of_val_logic_slice<T>(val: [T]) -> Int {
153 pearlite! { size_of_logic::<T>() * val@.len() }
154}
155
156#[allow(unused)]
157#[logic]
158#[intrinsic("size_of_val_logic_str")]
159fn size_of_val_logic_str(val: str) -> Int {
160 pearlite! { val@.to_bytes().len() }
161}
162
163#[trusted]
167#[logic(open, inline)]
168#[intrinsic("align_of_logic")]
169#[ensures(0usize != result && result & (result - 1usize) == 0usize)]
170#[ensures(size_of_logic::<T>() % result@ == 0)]
171pub fn align_of_logic<T>() -> usize {
172 dead
173}