Skip to main content

vstd/
vstd.rs

1//! The "standard library" for [Verus](https://github.com/verus-lang/verus).
2//! Contains various utilities and datatypes for proofs,
3//! as well as runtime functionality with specifications.
4//! For an introduction to Verus, see [the tutorial](https://verus-lang.github.io/verus/guide/).
5#![cfg_attr(not(feature = "std"), no_std)]
6#![allow(unused_parens)]
7#![allow(unused_imports)]
8#![allow(dead_code)]
9#![allow(unused_attributes)]
10#![allow(unused_features)] // silences spurious warnings for features that cause errors when omitted
11#![allow(rustdoc::invalid_rust_codeblocks)]
12#![cfg_attr(verus_keep_ghost, feature(atomic_internals))]
13#![cfg_attr(verus_keep_ghost, feature(generic_atomic))]
14#![cfg_attr(verus_keep_ghost, feature(core_intrinsics))]
15#![cfg_attr(any(verus_keep_ghost, feature = "allocator"), feature(allocator_api))]
16#![cfg_attr(verus_keep_ghost, feature(step_trait))]
17#![cfg_attr(verus_keep_ghost, feature(ptr_metadata))]
18#![cfg_attr(verus_keep_ghost, feature(sized_hierarchy))]
19#![cfg_attr(verus_keep_ghost, feature(freeze))]
20#![cfg_attr(verus_keep_ghost, feature(derive_clone_copy_internals))]
21#![cfg_attr(verus_keep_ghost, feature(derive_eq_internals))]
22#![cfg_attr(verus_keep_ghost, feature(slice_index_methods))]
23#![cfg_attr(all(feature = "alloc", verus_keep_ghost), feature(liballoc_internals))]
24
25#[cfg(feature = "alloc")]
26extern crate alloc;
27
28pub mod arithmetic;
29pub mod array;
30pub mod atomic;
31pub mod atomic_ghost;
32pub mod bits;
33pub mod bytes;
34pub mod calc_macro;
35pub mod cell;
36pub mod compute;
37pub mod contrib;
38pub mod endian;
39pub mod float;
40pub mod function;
41#[cfg(feature = "std")]
42pub mod future;
43#[cfg(all(feature = "alloc", feature = "std"))]
44pub mod hash_map;
45#[cfg(all(feature = "alloc", feature = "std"))]
46pub mod hash_set;
47pub mod imap;
48pub mod imap_lib;
49pub mod invariant;
50pub mod iset;
51pub mod iset_lib;
52#[cfg(verus_keep_ghost)]
53pub mod laws_cmp;
54#[cfg(verus_keep_ghost)]
55pub mod laws_eq;
56pub mod layout;
57pub mod logatom;
58pub mod map;
59pub mod map_lib;
60pub mod math;
61pub mod modes;
62pub mod multiset;
63pub mod multiset_lib;
64pub mod pervasive;
65pub mod predicate;
66pub mod proph;
67pub mod raw_ptr;
68pub mod relations;
69pub mod resource;
70pub mod rwlock;
71pub mod seq;
72pub mod seq_lib;
73pub mod set;
74pub mod set_lib;
75pub mod shared;
76#[cfg(feature = "alloc")]
77pub mod simple_pptr;
78pub mod slice;
79pub mod state_machine_internal;
80pub mod string;
81#[cfg(feature = "std")]
82pub mod thread;
83pub mod tokens;
84pub mod utf8;
85pub mod view;
86pub mod wrapping;
87
88#[cfg(verus_keep_ghost)]
89pub mod std_specs;
90
91// Re-exports all vstd types, traits, and functions that are commonly used or replace
92// regular `core` or `std` definitions.
93pub mod prelude;
94
95use prelude::*;
96
97verus! {
98
99#[cfg_attr(verus_keep_ghost, verifier::broadcast_use_by_default_when_this_crate_is_imported)]
100pub broadcast group group_vstd_default {
101    //
102    // basic Verus math, types, and features
103    //
104    seq::group_seq_axioms,
105    seq_lib::group_seq_lib_default,
106    map::group_map_lemmas,
107    set::group_set_lemmas,
108    imap::group_imap_lemmas,
109    iset::group_iset_lemmas,
110    set_lib::group_set_lib_default,
111    multiset::group_multiset_axioms,
112    compute::all_spec_ensures,
113    function::group_function_axioms,
114    laws_eq::group_laws_eq,
115    laws_cmp::group_laws_cmp,
116    //
117    // Rust types
118    //
119    slice::group_slice_axioms,
120    array::group_array_axioms,
121    #[cfg(not(verus_verify_core))]
122    string::group_string_axioms,
123    raw_ptr::group_raw_ptr_axioms,
124    layout::group_layout_axioms,
125    //
126    // core std_specs
127    //
128    std_specs::range::group_range_axioms,
129    std_specs::bits::group_bits_axioms,
130    std_specs::control_flow::group_control_flow_axioms,
131    std_specs::slice::group_slice_axioms,
132    std_specs::manually_drop::group_manually_drop_axioms,
133    std_specs::iter::group_iter_axioms,
134    //
135    // std_specs for alloc (with or without std)
136    //
137    #[cfg(feature = "alloc")]
138    std_specs::vec::group_vec_axioms,
139    #[cfg(feature = "alloc")]
140    std_specs::vecdeque::group_vec_dequeue_axioms,
141    //
142    // std_specs for alloc + std
143    //
144    #[cfg(all(feature = "alloc", feature = "std"))]
145    std_specs::hash::group_hash_axioms,
146    #[cfg(feature = "alloc")]
147    std_specs::btree::group_btree_axioms,
148}
149
150} // verus!
151// This allows us to use `$crate::vstd` or `crate::vstd` to refer to vstd
152// both in verus_verify_core mode (vstd is a module) and out (vstd is a crate)
153#[cfg(not(verus_verify_core))]
154#[doc(hidden)]
155pub use crate as vstd;