rust_verify/src/verus_items.rs
Line | Count | Source |
1 | | use air::ast::Ident; |
2 | | use regex::Regex; |
3 | | use rustc_middle::ty::{TyCtxt, TyKind}; |
4 | | use rustc_span::def_id::DefId; |
5 | | use std::{collections::HashMap, sync::Arc}; |
6 | | use vir::ast::CrateId; |
7 | | |
8 | | // The names returned by this are intended exclusively for matching in `get_rust_item` |
9 | 506k | fn ty_to_stable_string_partial<'tcx>( |
10 | 506k | tcx: TyCtxt<'tcx>, |
11 | 506k | ty: &rustc_middle::ty::Ty<'_>, |
12 | 506k | ) -> Option<String> { |
13 | 506k | Some(match ty.kind() { |
14 | 32 | TyKind::Bool => format!("bool"), |
15 | 66 | TyKind::Char => format!("char"), |
16 | 12.1k | TyKind::Int(t) => format!("{}", t.name_str()), |
17 | 16.1k | TyKind::Uint(t) => format!("{}", t.name_str()), |
18 | 0 | TyKind::Float(t) => format!("{}", t.name_str()), |
19 | 435 | TyKind::RawPtr(ty, tm) => format!( |
20 | | "*{} {}", |
21 | 435 | match tm { |
22 | 321 | rustc_ast::Mutability::Mut => "mut", |
23 | 114 | rustc_ast::Mutability::Not => "const", |
24 | | }, |
25 | 435 | ty_to_stable_string_partial(tcx, ty)?, |
26 | | ), |
27 | 0 | TyKind::Ref(_r, ty, mutbl) => format!( |
28 | | "&{} {}", |
29 | 0 | match mutbl { |
30 | 0 | rustc_ast::Mutability::Mut => "mut", |
31 | 0 | rustc_ast::Mutability::Not => "const", |
32 | | }, |
33 | 0 | ty_to_stable_string_partial(tcx, ty)?, |
34 | | ), |
35 | 0 | TyKind::Never => format!("!"), |
36 | 0 | TyKind::Tuple(tys) => format!( |
37 | | "({})", |
38 | 0 | tys.iter() |
39 | 0 | .map(|ty| ty_to_stable_string_partial(tcx, &ty)) |
40 | 0 | .collect::<Option<Vec<_>>>()? |
41 | 0 | .join(",") |
42 | | ), |
43 | 1.53k | TyKind::Param(param_ty) => format!("{}", param_ty.name.as_str()), |
44 | 472k | TyKind::Adt(def, _substs) => { |
45 | 472k | return Some(def_id_to_stable_rust_path(tcx, def.did())?); |
46 | | } |
47 | 375 | TyKind::Str => format!("str"), |
48 | 28 | TyKind::Array(ty, sz) => { |
49 | 28 | format!("[{}; {}]", ty_to_stable_string_partial(tcx, &ty)?, sz) |
50 | | } |
51 | 1.07k | TyKind::Slice(ty) => format!("[{}]", ty_to_stable_string_partial(tcx, &ty)?), |
52 | 1.67k | _ => return None, |
53 | | }) |
54 | 506k | } |
55 | | |
56 | | /// NOTE: do not use this to determine if something is a well known / rust lang item |
57 | | /// use verus_items::get_rust_item instead |
58 | 5.24M | pub(crate) fn def_id_to_stable_rust_path<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Option<String> { |
59 | 5.24M | let def_path = tcx.def_path(def_id); |
60 | 5.24M | let mut segments: Vec<String> = Vec::with_capacity(def_path.data.len()); |
61 | 5.24M | let crate_name = tcx.crate_name(def_path.krate); |
62 | 5.24M | segments.push(crate_name.to_ident_string()); |
63 | 5.24M | let mut one_impl_block_in_path = false; |
64 | 11.7M | for d in def_path.data.iter() { |
65 | | use rustc_hir::definitions::DefPathData; |
66 | 11.7M | match &d.data { |
67 | 9.27M | DefPathData::ValueNs(symbol) | DefPathData::TypeNs(symbol) => { |
68 | 11.2M | segments.push(symbol.to_string()) |
69 | | } |
70 | 0 | DefPathData::Ctor => segments.push(vir::def::RUST_DEF_CTOR.to_string()), |
71 | | DefPathData::Impl => { |
72 | 504k | if one_impl_block_in_path { |
73 | 0 | return None; |
74 | 504k | } |
75 | 504k | one_impl_block_in_path = true; |
76 | 504k | let self_ty = tcx.type_of(tcx.parent(def_id)).skip_binder(); |
77 | 504k | let path = ty_to_stable_string_partial(tcx, &self_ty)?; |
78 | 503k | segments.clear(); |
79 | 503k | segments.push(path); |
80 | | } |
81 | 1 | DefPathData::ForeignMod => { |
82 | 1 | // this segment can be ignored |
83 | 1 | } |
84 | 6 | _ => return None, |
85 | | } |
86 | | } |
87 | 5.24M | Some(segments.join("::")) |
88 | 5.24M | } |
89 | | |
90 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
91 | | pub(crate) enum SpecItem { |
92 | | Admit, |
93 | | Assume, |
94 | | NoMethodBody, |
95 | | Requires, |
96 | | Recommends, |
97 | | Ensures, |
98 | | Returns, |
99 | | InvariantExceptBreak, |
100 | | Invariant, |
101 | | AtomicSpec, |
102 | | AtomicCallLoop, |
103 | | Decreases, |
104 | | DecreasesWhen, |
105 | | DecreasesBy, |
106 | | RecommendsBy, |
107 | | OpensInvariantMask, |
108 | | InvMaskNone, |
109 | | InvMaskAny, |
110 | | InvMaskList, |
111 | | InvMaskListCompl, |
112 | | InvMaskSet, |
113 | | Atomically, |
114 | | NoUnwind, |
115 | | NoUnwindWhen, |
116 | | } |
117 | | |
118 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
119 | | pub(crate) enum QuantItem { |
120 | | Forall, |
121 | | Exists, |
122 | | } |
123 | | |
124 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
125 | | pub(crate) enum DirectiveItem { |
126 | | ExtraDependency, |
127 | | RevealHide, |
128 | | RevealHideInternalPath, |
129 | | RevealStrlit, |
130 | | RevealByteslit, |
131 | | InlineAirStmt, |
132 | | } |
133 | | |
134 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
135 | | pub(crate) enum ExprItem { |
136 | | Choose, |
137 | | ChooseTuple, |
138 | | Old, |
139 | | GetVariantField, |
140 | | GetUnionField, |
141 | | IsVariant, |
142 | | ArrayIndex, |
143 | | F32ToBits, |
144 | | F64ToBits, |
145 | | StrSliceLen, |
146 | | StrSliceGetChar, |
147 | | ArchWordBits, |
148 | | ClosureToFnSpec, |
149 | | ClosureToFnProof, |
150 | | SignedMin, |
151 | | SignedMax, |
152 | | UnsignedMax, |
153 | | IsSmallerThan, |
154 | | IsSmallerThanLexicographic, |
155 | | IsSmallerThanRecursiveFunctionField, |
156 | | DefaultEnsures, |
157 | | ShrRefStructWrap, |
158 | | } |
159 | | |
160 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
161 | | pub(crate) enum CompilableOprItem { |
162 | | Implies, |
163 | | // SmartPtrNew, |
164 | | GhostExec, |
165 | | GhostNew, |
166 | | TrackedNew, |
167 | | TrackedExec, |
168 | | TrackedExecBorrow, |
169 | | TrackedGet, |
170 | | TrackedBorrow, |
171 | | TrackedBorrowMut, |
172 | | // GhostSplitTuple, |
173 | | // TrackedSplitTuple, |
174 | | } |
175 | | |
176 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
177 | | pub(crate) enum BuiltinDerefItem { |
178 | | TrackedDeref, |
179 | | TrackedDerefMut, |
180 | | GhostDeref, |
181 | | GhostDerefMut, |
182 | | } |
183 | | |
184 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
185 | | pub(crate) enum ArithItem { |
186 | | BuiltinAdd, |
187 | | BuiltinSub, |
188 | | BuiltinMul, |
189 | | } |
190 | | |
191 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
192 | | pub(crate) enum EqualityItem { |
193 | | Equal, |
194 | | SpecEq, |
195 | | ExtEqual, |
196 | | ExtEqualDeep, |
197 | | } |
198 | | |
199 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
200 | | pub(crate) enum SpecOrdItem { |
201 | | Le, |
202 | | Ge, |
203 | | Lt, |
204 | | Gt, |
205 | | } |
206 | | |
207 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
208 | | pub(crate) enum SpecArithItem { |
209 | | Add, |
210 | | Sub, |
211 | | Mul, |
212 | | EuclideanOrRealDiv, |
213 | | EuclideanMod, |
214 | | } |
215 | | |
216 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
217 | | pub(crate) enum SpecBitwiseItem { |
218 | | BitAnd, |
219 | | BitOr, |
220 | | BitXor, |
221 | | Shl, |
222 | | Shr, |
223 | | } |
224 | | |
225 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
226 | | pub(crate) enum IeeeFloatUnaryItem { |
227 | | Cast, |
228 | | Neg, |
229 | | Floor, |
230 | | Ceil, |
231 | | Round, |
232 | | RoundTiesEven, |
233 | | Trunc, |
234 | | IsNormal, |
235 | | IsSubnormal, |
236 | | IsZero, |
237 | | IsInfinite, |
238 | | IsNaN, |
239 | | IsNegative, |
240 | | IsPositive, |
241 | | } |
242 | | |
243 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
244 | | pub(crate) enum IeeeFloatBinaryItem { |
245 | | Add, |
246 | | Sub, |
247 | | Mul, |
248 | | Div, |
249 | | Eq, |
250 | | Le, |
251 | | Ge, |
252 | | Lt, |
253 | | Gt, |
254 | | } |
255 | | |
256 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
257 | | pub(crate) enum BinaryOpItem { |
258 | | Arith(ArithItem), |
259 | | Equality(EqualityItem), |
260 | | SpecOrd(SpecOrdItem), |
261 | | SpecArith(SpecArithItem), |
262 | | SpecBitwise(SpecBitwiseItem), |
263 | | IeeeFloat(IeeeFloatBinaryItem), |
264 | | } |
265 | | |
266 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
267 | | pub(crate) enum ChainedItem { |
268 | | Value, |
269 | | Le, |
270 | | Lt, |
271 | | Ge, |
272 | | Gt, |
273 | | Cmp, |
274 | | Eq, |
275 | | } |
276 | | |
277 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
278 | | pub(crate) enum AssertItem { |
279 | | Assert, |
280 | | AssertBy, |
281 | | AssertByCompute, |
282 | | AssertByComputeOnly, |
283 | | AssertNonlinearBy, |
284 | | AssertBitvectorBy, |
285 | | AssertForallBy, |
286 | | AssertBitVector, |
287 | | } |
288 | | |
289 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
290 | | pub(crate) enum SpecLiteralItem { |
291 | | Integer, |
292 | | Int, |
293 | | Nat, |
294 | | Decimal, |
295 | | } |
296 | | |
297 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
298 | | pub(crate) enum SpecGhostTrackedItem { |
299 | | GhostView, |
300 | | GhostBorrow, |
301 | | GhostBorrowMut, |
302 | | TrackedView, |
303 | | } |
304 | | |
305 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
306 | | pub(crate) enum UnaryOpItem { |
307 | | SpecLiteral(SpecLiteralItem), |
308 | | SpecNeg, |
309 | | SpecCastInteger, |
310 | | SpecCastReal, |
311 | | SpecCastFloat, |
312 | | RealFloor, |
313 | | SpecGhostTracked(SpecGhostTrackedItem), |
314 | | IeeeFloat(IeeeFloatUnaryItem), |
315 | | } |
316 | | |
317 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
318 | | pub(crate) enum OpenInvariantBlockItem { |
319 | | OpenLocalInvariantBegin, |
320 | | OpenAtomicInvariantBegin, |
321 | | OpenInvariantEnd, |
322 | | } |
323 | | |
324 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
325 | | pub(crate) enum OpenAtomicUpdateItem { |
326 | | TryOpenAtomicUpdateBegin, |
327 | | TryOpenAtomicUpdateEnd, |
328 | | } |
329 | | |
330 | | #[derive(PartialEq, Eq, Debug, Clone, Hash)] |
331 | | pub(crate) enum InvariantItem { |
332 | | AtomicInvariantNamespace, |
333 | | AtomicInvariantInv, |
334 | | LocalInvariantNamespace, |
335 | | LocalInvariantInv, |
336 | | CreateOpenInvariantCredit, |
337 | | SpendOpenInvariantCredit, |
338 | | SpendOpenInvariantCreditInProof, |
339 | | } |
340 | | |
341 | | #[derive(PartialEq, Eq, Debug, Clone, Hash)] |
342 | | pub(crate) enum AtomicUpdateItem { |
343 | | AtomicUpdateReq, |
344 | | AtomicUpdateEns, |
345 | | AtomicUpdatePred, |
346 | | AtomicUpdateResolves, |
347 | | AtomicUpdateInput, |
348 | | AtomicUpdateOutput, |
349 | | AtomicUpdateOuterMask, |
350 | | AtomicUpdateInnerMask, |
351 | | } |
352 | | |
353 | | #[derive(PartialEq, Eq, Debug, Clone, Hash)] |
354 | | pub(crate) enum SetItem { |
355 | | Type, |
356 | | Empty, |
357 | | Full, |
358 | | Contains, |
359 | | SubsetOf, |
360 | | Insert, |
361 | | Remove, |
362 | | } |
363 | | |
364 | | #[derive(PartialEq, Eq, Debug, Clone, Hash)] |
365 | | pub(crate) enum VstdItem { |
366 | | SeqFn(vir::interpreter::SeqFn), |
367 | | SetItem(SetItem), |
368 | | ISetItem(SetItem), |
369 | | Invariant(InvariantItem), |
370 | | AtomicUpdate(AtomicUpdateItem), |
371 | | PredArgs, |
372 | | BranchBool, |
373 | | ExecNonstaticCall, |
374 | | ProofNonstaticCall, |
375 | | ArrayIndexGet, |
376 | | ArrayAsSlice, |
377 | | ArrayFillForCopyTypes, |
378 | | SpecArrayUpdate, |
379 | | SliceIndexGet, |
380 | | SpecSliceUpdate, |
381 | | SpecSliceLen, |
382 | | SpecSliceIndex, |
383 | | CastPtrToThinPtr, |
384 | | CastArrayPtrToSlicePtr, |
385 | | CastSlicePtrToSlicePtr, |
386 | | CastSlicePtrToStrPtr, |
387 | | CastStrPtrToSlicePtr, |
388 | | CastPtrToUsize, |
389 | | FloatCast, |
390 | | RefMutArrayUnsizingCoercion, |
391 | | VecIndex, |
392 | | VecIndexMut, |
393 | | SharedReference, |
394 | | } |
395 | | |
396 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
397 | | pub(crate) enum MarkerItem { |
398 | | Structural, |
399 | | } |
400 | | |
401 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
402 | | pub(crate) enum BuiltinTypeItem { |
403 | | Int, |
404 | | Nat, |
405 | | Real, |
406 | | FnSpec, |
407 | | Ghost, |
408 | | Tracked, |
409 | | } |
410 | | |
411 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
412 | | pub(crate) enum BuiltinTraitItem { |
413 | | Integer, |
414 | | Chainable, |
415 | | Sealed, |
416 | | } |
417 | | |
418 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
419 | | pub(crate) enum BuiltinFunctionItem { |
420 | | CallRequires, |
421 | | CallEnsures, |
422 | | ConstrainType, |
423 | | GetFutureOutputType, |
424 | | } |
425 | | |
426 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
427 | | pub(crate) enum GlobalItem { |
428 | | SizeOf, |
429 | | } |
430 | | |
431 | | #[derive(PartialEq, Eq, Debug, Clone, Copy, Hash)] |
432 | | #[allow(non_camel_case_types)] |
433 | | pub(crate) enum ExternalItem { |
434 | | FnProof, |
435 | | FOpts, |
436 | | FnProofReq, |
437 | | FnProofEns, |
438 | | ProofFnOnce, |
439 | | ProofFnMut, |
440 | | ProofFn, |
441 | | Trk, |
442 | | RqEn, |
443 | | } |
444 | | |
445 | | #[derive(PartialEq, Eq, Debug, Clone, Hash)] |
446 | | pub(crate) enum RustPrivate { |
447 | | Path(vir::ast::Path), |
448 | | FormatArgumentFn(Ident), |
449 | | FormatArgumentsFn(Ident), |
450 | | } |
451 | | |
452 | | #[derive(PartialEq, Eq, Debug, Clone, Hash)] |
453 | | pub(crate) enum VerusItem { |
454 | | Spec(SpecItem), |
455 | | Quant(QuantItem), |
456 | | Directive(DirectiveItem), |
457 | | Expr(ExprItem), |
458 | | CompilableOpr(CompilableOprItem), |
459 | | BinaryOp(BinaryOpItem), |
460 | | UnaryOp(UnaryOpItem), |
461 | | Chained(ChainedItem), |
462 | | Assert(AssertItem), |
463 | | UseTypeInvariant, |
464 | | WithTriggers, |
465 | | OpenInvariantBlock(OpenInvariantBlockItem), |
466 | | OpenAtomicUpdate(OpenAtomicUpdateItem), |
467 | | Vstd(VstdItem, Option<Ident>), |
468 | | RustPrivate(RustPrivate), |
469 | | Marker(MarkerItem), |
470 | | BuiltinType(BuiltinTypeItem), |
471 | | BuiltinTrait(BuiltinTraitItem), |
472 | | BuiltinFunction(BuiltinFunctionItem), |
473 | | BuiltinDeref(BuiltinDerefItem), |
474 | | Global(GlobalItem), |
475 | | External(ExternalItem), |
476 | | HasResolved, |
477 | | HasResolvedUnsized, |
478 | | MutRefCurrent, |
479 | | MutRefFuture, |
480 | | Final, |
481 | | AfterBorrow, |
482 | | ErasedGhostValue, |
483 | | ShadowGhostValue, |
484 | | MutableReferenceTie, |
485 | | TwoPhaseMutableReferenceTie, |
486 | | GetFirst, |
487 | | DummyCapture(DummyCaptureItem), |
488 | | MutRefTracked, |
489 | | } |
490 | | |
491 | | #[derive(PartialEq, Eq, Debug, Clone, Hash)] |
492 | | pub(crate) enum DummyCaptureItem { |
493 | | Struct, |
494 | | New, |
495 | | Consume, |
496 | | } |
497 | | |
498 | | #[rustfmt::skip] |
499 | 4.38k | fn verus_items_map() -> Vec<(&'static str, VerusItem)> { |
500 | 4.38k | vec![ |
501 | 4.38k | ("verus::verus_builtin::admit", VerusItem::Spec(SpecItem::Admit)), |
502 | 4.38k | ("verus::verus_builtin::assume_", VerusItem::Spec(SpecItem::Assume)), |
503 | 4.38k | ("verus::verus_builtin::no_method_body", VerusItem::Spec(SpecItem::NoMethodBody)), |
504 | 4.38k | ("verus::verus_builtin::requires", VerusItem::Spec(SpecItem::Requires)), |
505 | 4.38k | ("verus::verus_builtin::recommends", VerusItem::Spec(SpecItem::Recommends)), |
506 | 4.38k | ("verus::verus_builtin::ensures", VerusItem::Spec(SpecItem::Ensures)), |
507 | 4.38k | ("verus::verus_builtin::returns", VerusItem::Spec(SpecItem::Returns)), |
508 | 4.38k | ("verus::verus_builtin::invariant_except_break", VerusItem::Spec(SpecItem::InvariantExceptBreak)), |
509 | 4.38k | ("verus::verus_builtin::invariant", VerusItem::Spec(SpecItem::Invariant)), |
510 | 4.38k | ("verus::verus_builtin::atomic_spec", VerusItem::Spec(SpecItem::AtomicSpec)), |
511 | 4.38k | ("verus::verus_builtin::atomic_call_loop", VerusItem::Spec(SpecItem::AtomicCallLoop)), |
512 | 4.38k | ("verus::verus_builtin::decreases", VerusItem::Spec(SpecItem::Decreases)), |
513 | 4.38k | ("verus::verus_builtin::decreases_when", VerusItem::Spec(SpecItem::DecreasesWhen)), |
514 | 4.38k | ("verus::verus_builtin::decreases_by", VerusItem::Spec(SpecItem::DecreasesBy)), |
515 | 4.38k | ("verus::verus_builtin::recommends_by", VerusItem::Spec(SpecItem::RecommendsBy)), |
516 | | |
517 | 4.38k | ("verus::verus_builtin::opens_invariant_mask", VerusItem::Spec(SpecItem::OpensInvariantMask)), |
518 | | |
519 | 4.38k | ("verus::verus_builtin::inv_mask_none", VerusItem::Spec(SpecItem::InvMaskNone)), |
520 | 4.38k | ("verus::verus_builtin::inv_mask_any", VerusItem::Spec(SpecItem::InvMaskAny)), |
521 | 4.38k | ("verus::verus_builtin::inv_mask_list", VerusItem::Spec(SpecItem::InvMaskList)), |
522 | 4.38k | ("verus::verus_builtin::inv_mask_list_compl", VerusItem::Spec(SpecItem::InvMaskListCompl)), |
523 | 4.38k | ("verus::verus_builtin::inv_mask_set", VerusItem::Spec(SpecItem::InvMaskSet)), |
524 | | |
525 | 4.38k | ("verus::verus_builtin::no_unwind", VerusItem::Spec(SpecItem::NoUnwind)), |
526 | 4.38k | ("verus::verus_builtin::no_unwind_when", VerusItem::Spec(SpecItem::NoUnwindWhen)), |
527 | | |
528 | 4.38k | ("verus::verus_builtin::forall", VerusItem::Quant(QuantItem::Forall)), |
529 | 4.38k | ("verus::verus_builtin::exists", VerusItem::Quant(QuantItem::Exists)), |
530 | | |
531 | 4.38k | ("verus::verus_builtin::extra_dependency", VerusItem::Directive(DirectiveItem::ExtraDependency)), |
532 | 4.38k | ("verus::verus_builtin::reveal_hide", VerusItem::Directive(DirectiveItem::RevealHide)), |
533 | 4.38k | ("verus::verus_builtin::reveal_hide_internal_path", VerusItem::Directive(DirectiveItem::RevealHideInternalPath)), |
534 | 4.38k | ("verus::verus_builtin::reveal_strlit", VerusItem::Directive(DirectiveItem::RevealStrlit)), |
535 | 4.38k | ("verus::verus_builtin::reveal_byteslit", VerusItem::Directive(DirectiveItem::RevealByteslit)), |
536 | 4.38k | ("verus::verus_builtin::inline_air_stmt", VerusItem::Directive(DirectiveItem::InlineAirStmt)), |
537 | | |
538 | 4.38k | ("verus::verus_builtin::choose", VerusItem::Expr(ExprItem::Choose)), |
539 | 4.38k | ("verus::verus_builtin::choose_tuple", VerusItem::Expr(ExprItem::ChooseTuple)), |
540 | 4.38k | ("verus::verus_builtin::old", VerusItem::Expr(ExprItem::Old)), |
541 | 4.38k | ("verus::verus_builtin::get_variant_field", VerusItem::Expr(ExprItem::GetVariantField)), |
542 | 4.38k | ("verus::verus_builtin::get_union_field", VerusItem::Expr(ExprItem::GetUnionField)), |
543 | 4.38k | ("verus::verus_builtin::is_variant", VerusItem::Expr(ExprItem::IsVariant)), |
544 | 4.38k | ("verus::verus_builtin::array_index", VerusItem::Expr(ExprItem::ArrayIndex)), |
545 | 4.38k | ("verus::verus_builtin::f32_to_bits", VerusItem::Expr(ExprItem::F32ToBits)), |
546 | 4.38k | ("verus::verus_builtin::f64_to_bits", VerusItem::Expr(ExprItem::F64ToBits)), |
547 | 4.38k | ("verus::verus_builtin::strslice_len", VerusItem::Expr(ExprItem::StrSliceLen)), |
548 | 4.38k | ("verus::verus_builtin::strslice_get_char", VerusItem::Expr(ExprItem::StrSliceGetChar)), |
549 | 4.38k | ("verus::verus_builtin::arch_word_bits", VerusItem::Expr(ExprItem::ArchWordBits)), |
550 | 4.38k | ("verus::verus_builtin::closure_to_fn_spec", VerusItem::Expr(ExprItem::ClosureToFnSpec)), |
551 | 4.38k | ("verus::verus_builtin::closure_to_fn_proof", VerusItem::Expr(ExprItem::ClosureToFnProof)), |
552 | 4.38k | ("verus::verus_builtin::signed_min", VerusItem::Expr(ExprItem::SignedMin)), |
553 | 4.38k | ("verus::verus_builtin::signed_max", VerusItem::Expr(ExprItem::SignedMax)), |
554 | 4.38k | ("verus::verus_builtin::unsigned_max", VerusItem::Expr(ExprItem::UnsignedMax)), |
555 | 4.38k | ("verus::verus_builtin::is_smaller_than", VerusItem::Expr(ExprItem::IsSmallerThan)), |
556 | 4.38k | ("verus::verus_builtin::is_smaller_than_lexicographic", VerusItem::Expr(ExprItem::IsSmallerThanLexicographic)), |
557 | 4.38k | ("verus::verus_builtin::is_smaller_than_recursive_function_field", VerusItem::Expr(ExprItem::IsSmallerThanRecursiveFunctionField)), |
558 | 4.38k | ("verus::verus_builtin::default_ensures", VerusItem::Expr(ExprItem::DefaultEnsures)), |
559 | 4.38k | ("verus::verus_builtin::shr_ref_struct_wrap", VerusItem::Expr(ExprItem::ShrRefStructWrap)), |
560 | | |
561 | 4.38k | ("verus::verus_builtin::imply", VerusItem::CompilableOpr(CompilableOprItem::Implies)), |
562 | | // TODO ("verus::verus_builtin::smartptr_new", VerusItem::CompilableOpr(CompilableOprItem::SmartPtrNew)), |
563 | 4.38k | ("verus::verus_builtin::ghost_exec", VerusItem::CompilableOpr(CompilableOprItem::GhostExec)), |
564 | 4.38k | ("verus::verus_builtin::Ghost::new", VerusItem::CompilableOpr(CompilableOprItem::GhostNew)), |
565 | 4.38k | ("verus::verus_builtin::Tracked::new", VerusItem::CompilableOpr(CompilableOprItem::TrackedNew)), |
566 | 4.38k | ("verus::verus_builtin::tracked_exec", VerusItem::CompilableOpr(CompilableOprItem::TrackedExec)), |
567 | 4.38k | ("verus::verus_builtin::tracked_exec_borrow", VerusItem::CompilableOpr(CompilableOprItem::TrackedExecBorrow)), |
568 | 4.38k | ("verus::verus_builtin::Tracked::get", VerusItem::CompilableOpr(CompilableOprItem::TrackedGet)), |
569 | 4.38k | ("verus::verus_builtin::Tracked::borrow", VerusItem::CompilableOpr(CompilableOprItem::TrackedBorrow)), |
570 | 4.38k | ("verus::verus_builtin::Tracked::borrow_mut", VerusItem::CompilableOpr(CompilableOprItem::TrackedBorrowMut)), |
571 | | |
572 | 4.38k | ("verus::verus_builtin::Tracked::deref", VerusItem::BuiltinDeref(BuiltinDerefItem::TrackedDeref)), |
573 | 4.38k | ("verus::verus_builtin::Tracked::deref_mut", VerusItem::BuiltinDeref(BuiltinDerefItem::TrackedDerefMut)), |
574 | 4.38k | ("verus::verus_builtin::Ghost::deref", VerusItem::BuiltinDeref(BuiltinDerefItem::GhostDeref)), |
575 | 4.38k | ("verus::verus_builtin::Ghost::deref_mut", VerusItem::BuiltinDeref(BuiltinDerefItem::GhostDerefMut)), |
576 | | |
577 | 4.38k | ("verus::verus_builtin::add", VerusItem::BinaryOp(BinaryOpItem::Arith(ArithItem::BuiltinAdd))), |
578 | 4.38k | ("verus::verus_builtin::sub", VerusItem::BinaryOp(BinaryOpItem::Arith(ArithItem::BuiltinSub))), |
579 | 4.38k | ("verus::verus_builtin::mul", VerusItem::BinaryOp(BinaryOpItem::Arith(ArithItem::BuiltinMul))), |
580 | | |
581 | 4.38k | ("verus::verus_builtin::equal", VerusItem::BinaryOp(BinaryOpItem::Equality(EqualityItem::Equal))), |
582 | 4.38k | ("verus::verus_builtin::spec_eq", VerusItem::BinaryOp(BinaryOpItem::Equality(EqualityItem::SpecEq))), |
583 | 4.38k | ("verus::verus_builtin::ext_equal", VerusItem::BinaryOp(BinaryOpItem::Equality(EqualityItem::ExtEqual))), |
584 | 4.38k | ("verus::verus_builtin::ext_equal_deep", VerusItem::BinaryOp(BinaryOpItem::Equality(EqualityItem::ExtEqualDeep))), |
585 | | |
586 | 4.38k | ("verus::verus_builtin::SpecOrd::spec_le", VerusItem::BinaryOp(BinaryOpItem::SpecOrd(SpecOrdItem::Le))), |
587 | 4.38k | ("verus::verus_builtin::SpecOrd::spec_ge", VerusItem::BinaryOp(BinaryOpItem::SpecOrd(SpecOrdItem::Ge))), |
588 | 4.38k | ("verus::verus_builtin::SpecOrd::spec_lt", VerusItem::BinaryOp(BinaryOpItem::SpecOrd(SpecOrdItem::Lt))), |
589 | 4.38k | ("verus::verus_builtin::SpecOrd::spec_gt", VerusItem::BinaryOp(BinaryOpItem::SpecOrd(SpecOrdItem::Gt))), |
590 | | |
591 | 4.38k | ("verus::verus_builtin::SpecAdd::spec_add", VerusItem::BinaryOp(BinaryOpItem::SpecArith(SpecArithItem::Add))), |
592 | 4.38k | ("verus::verus_builtin::SpecSub::spec_sub", VerusItem::BinaryOp(BinaryOpItem::SpecArith(SpecArithItem::Sub))), |
593 | 4.38k | ("verus::verus_builtin::SpecMul::spec_mul", VerusItem::BinaryOp(BinaryOpItem::SpecArith(SpecArithItem::Mul))), |
594 | 4.38k | ("verus::verus_builtin::SpecEuclideanOrRealDiv::spec_euclidean_or_real_div", VerusItem::BinaryOp(BinaryOpItem::SpecArith(SpecArithItem::EuclideanOrRealDiv))), |
595 | 4.38k | ("verus::verus_builtin::SpecEuclideanMod::spec_euclidean_mod", VerusItem::BinaryOp(BinaryOpItem::SpecArith(SpecArithItem::EuclideanMod))), |
596 | | |
597 | 4.38k | ("verus::verus_builtin::SpecBitAnd::spec_bitand", VerusItem::BinaryOp(BinaryOpItem::SpecBitwise(SpecBitwiseItem::BitAnd))), |
598 | 4.38k | ("verus::verus_builtin::SpecBitOr::spec_bitor", VerusItem::BinaryOp(BinaryOpItem::SpecBitwise(SpecBitwiseItem::BitOr))), |
599 | 4.38k | ("verus::verus_builtin::SpecBitXor::spec_bitxor", VerusItem::BinaryOp(BinaryOpItem::SpecBitwise(SpecBitwiseItem::BitXor))), |
600 | 4.38k | ("verus::verus_builtin::SpecShl::spec_shl", VerusItem::BinaryOp(BinaryOpItem::SpecBitwise(SpecBitwiseItem::Shl))), |
601 | 4.38k | ("verus::verus_builtin::SpecShr::spec_shr", VerusItem::BinaryOp(BinaryOpItem::SpecBitwise(SpecBitwiseItem::Shr))), |
602 | | |
603 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_add", VerusItem::BinaryOp(BinaryOpItem::IeeeFloat(IeeeFloatBinaryItem::Add))), |
604 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_sub", VerusItem::BinaryOp(BinaryOpItem::IeeeFloat(IeeeFloatBinaryItem::Sub))), |
605 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_mul", VerusItem::BinaryOp(BinaryOpItem::IeeeFloat(IeeeFloatBinaryItem::Mul))), |
606 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_div", VerusItem::BinaryOp(BinaryOpItem::IeeeFloat(IeeeFloatBinaryItem::Div))), |
607 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_eq", VerusItem::BinaryOp(BinaryOpItem::IeeeFloat(IeeeFloatBinaryItem::Eq))), |
608 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_le", VerusItem::BinaryOp(BinaryOpItem::IeeeFloat(IeeeFloatBinaryItem::Le))), |
609 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_ge", VerusItem::BinaryOp(BinaryOpItem::IeeeFloat(IeeeFloatBinaryItem::Ge))), |
610 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_lt", VerusItem::BinaryOp(BinaryOpItem::IeeeFloat(IeeeFloatBinaryItem::Lt))), |
611 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_gt", VerusItem::BinaryOp(BinaryOpItem::IeeeFloat(IeeeFloatBinaryItem::Gt))), |
612 | | |
613 | 4.38k | ("verus::verus_builtin::spec_chained_value", VerusItem::Chained(ChainedItem::Value)), |
614 | 4.38k | ("verus::verus_builtin::spec_chained_le", VerusItem::Chained(ChainedItem::Le)), |
615 | 4.38k | ("verus::verus_builtin::spec_chained_lt", VerusItem::Chained(ChainedItem::Lt)), |
616 | 4.38k | ("verus::verus_builtin::spec_chained_ge", VerusItem::Chained(ChainedItem::Ge)), |
617 | 4.38k | ("verus::verus_builtin::spec_chained_gt", VerusItem::Chained(ChainedItem::Gt)), |
618 | 4.38k | ("verus::verus_builtin::spec_chained_cmp", VerusItem::Chained(ChainedItem::Cmp)), |
619 | 4.38k | ("verus::verus_builtin::spec_chained_eq", VerusItem::Chained(ChainedItem::Eq)), |
620 | | |
621 | 4.38k | ("verus::verus_builtin::assert_", VerusItem::Assert(AssertItem::Assert)), |
622 | 4.38k | ("verus::verus_builtin::assert_by", VerusItem::Assert(AssertItem::AssertBy)), |
623 | 4.38k | ("verus::verus_builtin::assert_by_compute", VerusItem::Assert(AssertItem::AssertByCompute)), |
624 | 4.38k | ("verus::verus_builtin::assert_by_compute_only", VerusItem::Assert(AssertItem::AssertByComputeOnly)), |
625 | 4.38k | ("verus::verus_builtin::assert_nonlinear_by", VerusItem::Assert(AssertItem::AssertNonlinearBy)), |
626 | 4.38k | ("verus::verus_builtin::assert_bitvector_by", VerusItem::Assert(AssertItem::AssertBitvectorBy)), |
627 | 4.38k | ("verus::verus_builtin::assert_forall_by", VerusItem::Assert(AssertItem::AssertForallBy)), |
628 | 4.38k | ("verus::verus_builtin::assert_bit_vector", VerusItem::Assert(AssertItem::AssertBitVector)), |
629 | 4.38k | ("verus::verus_builtin::use_type_invariant", VerusItem::UseTypeInvariant), |
630 | | |
631 | 4.38k | ("verus::verus_builtin::with_triggers", VerusItem::WithTriggers), |
632 | | |
633 | 4.38k | ("verus::verus_builtin::spec_literal_integer", VerusItem::UnaryOp(UnaryOpItem::SpecLiteral(SpecLiteralItem::Integer))), |
634 | 4.38k | ("verus::verus_builtin::spec_literal_int", VerusItem::UnaryOp(UnaryOpItem::SpecLiteral(SpecLiteralItem::Int))), |
635 | 4.38k | ("verus::verus_builtin::spec_literal_nat", VerusItem::UnaryOp(UnaryOpItem::SpecLiteral(SpecLiteralItem::Nat))), |
636 | 4.38k | ("verus::verus_builtin::spec_literal_decimal", VerusItem::UnaryOp(UnaryOpItem::SpecLiteral(SpecLiteralItem::Decimal))), |
637 | 4.38k | ("verus::verus_builtin::SpecNeg::spec_neg", VerusItem::UnaryOp(UnaryOpItem::SpecNeg)), |
638 | 4.38k | ("verus::verus_builtin::spec_cast_integer", VerusItem::UnaryOp(UnaryOpItem::SpecCastInteger)), |
639 | 4.38k | ("verus::verus_builtin::spec_cast_real", VerusItem::UnaryOp(UnaryOpItem::SpecCastReal)), |
640 | 4.38k | ("verus::verus_builtin::spec_cast_float", VerusItem::UnaryOp(UnaryOpItem::SpecCastFloat)), |
641 | 4.38k | ("verus::verus_builtin::real::floor", VerusItem::UnaryOp(UnaryOpItem::RealFloor)), |
642 | 4.38k | ("verus::verus_builtin::Ghost::view", VerusItem::UnaryOp(UnaryOpItem::SpecGhostTracked(SpecGhostTrackedItem::GhostView))), |
643 | 4.38k | ("verus::verus_builtin::Ghost::borrow", VerusItem::UnaryOp(UnaryOpItem::SpecGhostTracked(SpecGhostTrackedItem::GhostBorrow))), |
644 | 4.38k | ("verus::verus_builtin::Ghost::borrow_mut", VerusItem::UnaryOp(UnaryOpItem::SpecGhostTracked(SpecGhostTrackedItem::GhostBorrowMut))), |
645 | 4.38k | ("verus::verus_builtin::Tracked::view", VerusItem::UnaryOp(UnaryOpItem::SpecGhostTracked(SpecGhostTrackedItem::TrackedView))), |
646 | | |
647 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_neg", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::Neg))), |
648 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_floor", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::Floor))), |
649 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_ceil", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::Ceil))), |
650 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_round", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::Round))), |
651 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_round_ties_even", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::RoundTiesEven))), |
652 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_trunc", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::Trunc))), |
653 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_is_normal", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::IsNormal))), |
654 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_is_subnormal", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::IsSubnormal))), |
655 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_is_zero", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::IsZero))), |
656 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_is_infinite", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::IsInfinite))), |
657 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_is_nan", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::IsNaN))), |
658 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_is_negative", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::IsNegative))), |
659 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_is_positive", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::IsPositive))), |
660 | 4.38k | ("verus::verus_builtin::IeeeFloat::ieee_is_positive", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::IsPositive))), |
661 | 4.38k | ("verus::verus_builtin::IeeeFloatCast::ieee_cast", VerusItem::UnaryOp(UnaryOpItem::IeeeFloat(IeeeFloatUnaryItem::Cast))), |
662 | | |
663 | 4.38k | ("verus::verus_builtin::erased_ghost_value", VerusItem::ErasedGhostValue), |
664 | 4.38k | ("verus::verus_builtin::shadow_ghost_value", VerusItem::ShadowGhostValue), |
665 | 4.38k | ("verus::verus_builtin::mutable_reference_tie", VerusItem::MutableReferenceTie), |
666 | 4.38k | ("verus::verus_builtin::two_phase_mutable_reference_tie", VerusItem::TwoPhaseMutableReferenceTie), |
667 | 4.38k | ("verus::verus_builtin::verus_erasure_get_first", VerusItem::GetFirst), |
668 | 4.38k | ("verus::verus_builtin::DummyCapture", VerusItem::DummyCapture(DummyCaptureItem::Struct)), |
669 | 4.38k | ("verus::verus_builtin::dummy_capture_new", VerusItem::DummyCapture(DummyCaptureItem::New)), |
670 | 4.38k | ("verus::verus_builtin::dummy_capture_consume", VerusItem::DummyCapture(DummyCaptureItem::Consume)), |
671 | | |
672 | 4.38k | ("verus::vstd::invariant::open_atomic_invariant_begin", VerusItem::OpenInvariantBlock(OpenInvariantBlockItem::OpenAtomicInvariantBegin)), |
673 | 4.38k | ("verus::vstd::invariant::open_local_invariant_begin", VerusItem::OpenInvariantBlock(OpenInvariantBlockItem::OpenLocalInvariantBegin)), |
674 | 4.38k | ("verus::vstd::invariant::open_invariant_end", VerusItem::OpenInvariantBlock(OpenInvariantBlockItem::OpenInvariantEnd)), |
675 | | |
676 | 4.38k | ("verus::vstd::atomic::try_open_atomic_update_begin", VerusItem::OpenAtomicUpdate(OpenAtomicUpdateItem::TryOpenAtomicUpdateBegin)), |
677 | 4.38k | ("verus::vstd::atomic::try_open_atomic_update_end", VerusItem::OpenAtomicUpdate(OpenAtomicUpdateItem::TryOpenAtomicUpdateEnd)), |
678 | | |
679 | 4.38k | ("verus::vstd::seq::Seq::empty", VerusItem::Vstd(VstdItem::SeqFn(vir::interpreter::SeqFn::Empty ), Some(Arc::new("seq::Seq::empty" .to_owned())))), |
680 | 4.38k | ("verus::vstd::seq::Seq::new", VerusItem::Vstd(VstdItem::SeqFn(vir::interpreter::SeqFn::New ), Some(Arc::new("seq::Seq::new" .to_owned())))), |
681 | 4.38k | ("verus::vstd::seq::Seq::push", VerusItem::Vstd(VstdItem::SeqFn(vir::interpreter::SeqFn::Push ), Some(Arc::new("seq::Seq::push" .to_owned())))), |
682 | 4.38k | ("verus::vstd::seq::Seq::update", VerusItem::Vstd(VstdItem::SeqFn(vir::interpreter::SeqFn::Update ), Some(Arc::new("seq::Seq::update" .to_owned())))), |
683 | 4.38k | ("verus::vstd::seq::Seq::subrange", VerusItem::Vstd(VstdItem::SeqFn(vir::interpreter::SeqFn::Subrange), Some(Arc::new("seq::Seq::subrange" .to_owned())))), |
684 | 4.38k | ("verus::vstd::seq::Seq::add", VerusItem::Vstd(VstdItem::SeqFn(vir::interpreter::SeqFn::Add ), Some(Arc::new("seq::Seq::add" .to_owned())))), |
685 | 4.38k | ("verus::vstd::seq::Seq::len", VerusItem::Vstd(VstdItem::SeqFn(vir::interpreter::SeqFn::Len ), Some(Arc::new("seq::Seq::len" .to_owned())))), |
686 | 4.38k | ("verus::vstd::seq::Seq::index", VerusItem::Vstd(VstdItem::SeqFn(vir::interpreter::SeqFn::Index ), Some(Arc::new("seq::Seq::index" .to_owned())))), |
687 | 4.38k | ("verus::vstd::seq::Seq::ext_equal", VerusItem::Vstd(VstdItem::SeqFn(vir::interpreter::SeqFn::ExtEqual), Some(Arc::new("seq::Seq::ext_equal" .to_owned())))), |
688 | 4.38k | ("verus::vstd::seq::Seq::last", VerusItem::Vstd(VstdItem::SeqFn(vir::interpreter::SeqFn::Last ), Some(Arc::new("seq::Seq::last" .to_owned())))), |
689 | | |
690 | 4.38k | ("verus::vstd::set::Set", VerusItem::Vstd(VstdItem::SetItem(SetItem::Type), Some(Arc::new("set::Set".to_owned())))), |
691 | 4.38k | ("verus::vstd::set::Set::empty", VerusItem::Vstd(VstdItem::SetItem(SetItem::Empty), Some(Arc::new("set::Set::empty".to_owned())))), |
692 | 4.38k | ("verus::vstd::set::Set::full", VerusItem::Vstd(VstdItem::SetItem(SetItem::Full), Some(Arc::new("set::Set::full".to_owned())))), |
693 | 4.38k | ("verus::vstd::set::Set::contains", VerusItem::Vstd(VstdItem::SetItem(SetItem::Contains), Some(Arc::new("set::Set::contains".to_owned())))), |
694 | 4.38k | ("verus::vstd::set::Set::subset_of", VerusItem::Vstd(VstdItem::SetItem(SetItem::SubsetOf), Some(Arc::new("set::Set::subset_of".to_owned())))), |
695 | 4.38k | ("verus::vstd::set::Set::insert", VerusItem::Vstd(VstdItem::SetItem(SetItem::Insert), Some(Arc::new("set::Set::insert".to_owned())))), |
696 | 4.38k | ("verus::vstd::set::Set::remove", VerusItem::Vstd(VstdItem::SetItem(SetItem::Remove), Some(Arc::new("set::Set::remove".to_owned())))), |
697 | | |
698 | 4.38k | ("verus::vstd::iset::ISet", VerusItem::Vstd(VstdItem::ISetItem(SetItem::Type), Some(Arc::new("iset::ISet".to_owned())))), |
699 | 4.38k | ("verus::vstd::iset::ISet::empty", VerusItem::Vstd(VstdItem::ISetItem(SetItem::Empty), Some(Arc::new("iset::ISet::empty".to_owned())))), |
700 | 4.38k | ("verus::vstd::iset::ISet::full", VerusItem::Vstd(VstdItem::ISetItem(SetItem::Full), Some(Arc::new("iset::ISet::full".to_owned())))), |
701 | 4.38k | ("verus::vstd::iset::ISet::contains", VerusItem::Vstd(VstdItem::ISetItem(SetItem::Contains), Some(Arc::new("iset::ISet::contains".to_owned())))), |
702 | 4.38k | ("verus::vstd::iset::ISet::subset_of", VerusItem::Vstd(VstdItem::ISetItem(SetItem::SubsetOf), Some(Arc::new("iset::ISet::subset_of".to_owned())))), |
703 | 4.38k | ("verus::vstd::iset::ISet::insert", VerusItem::Vstd(VstdItem::ISetItem(SetItem::Insert), Some(Arc::new("iset::ISet::insert".to_owned())))), |
704 | 4.38k | ("verus::vstd::iset::ISet::remove", VerusItem::Vstd(VstdItem::ISetItem(SetItem::Remove), Some(Arc::new("iset::ISet::remove".to_owned())))), |
705 | | |
706 | 4.38k | ("verus::vstd::invariant::AtomicInvariant::namespace", VerusItem::Vstd(VstdItem::Invariant(InvariantItem::AtomicInvariantNamespace ), Some(Arc::new("invariant::AtomicInvariant::namespace" .to_owned())))), |
707 | 4.38k | ("verus::vstd::invariant::AtomicInvariant::inv", VerusItem::Vstd(VstdItem::Invariant(InvariantItem::AtomicInvariantInv ), Some(Arc::new("invariant::AtomicInvariant::inv" .to_owned())))), |
708 | 4.38k | ("verus::vstd::invariant::LocalInvariant::namespace", VerusItem::Vstd(VstdItem::Invariant(InvariantItem::LocalInvariantNamespace ), Some(Arc::new("invariant::LocalInvariant::namespace" .to_owned())))), |
709 | 4.38k | ("verus::vstd::invariant::LocalInvariant::inv", VerusItem::Vstd(VstdItem::Invariant(InvariantItem::LocalInvariantInv ), Some(Arc::new("invariant::LocalInvariant::inv" .to_owned())))), |
710 | 4.38k | ("verus::vstd::invariant::create_open_invariant_credit", VerusItem::Vstd(VstdItem::Invariant(InvariantItem::CreateOpenInvariantCredit ), Some(Arc::new("invariant::create_open_invariant_credit" .to_owned())))), |
711 | 4.38k | ("verus::vstd::invariant::spend_open_invariant_credit", VerusItem::Vstd(VstdItem::Invariant(InvariantItem::SpendOpenInvariantCredit ), Some(Arc::new("invariant::spend_open_invariant_credit" .to_owned())))), |
712 | 4.38k | ("verus::vstd::invariant::spend_open_invariant_credit_in_proof", VerusItem::Vstd(VstdItem::Invariant(InvariantItem::SpendOpenInvariantCreditInProof), Some(Arc::new("invariant::spend_open_invariant_credit_in_proof".to_owned())))), |
713 | 4.38k | ("verus::vstd::vstd::exec_nonstatic_call", VerusItem::Vstd(VstdItem::ExecNonstaticCall, Some(Arc::new("pervasive::exec_nonstatic_call".to_owned())))), |
714 | 4.38k | ("verus::vstd::vstd::proof_nonstatic_call", VerusItem::Vstd(VstdItem::ProofNonstaticCall, Some(Arc::new("pervasive::proof_nonstatic_call".to_owned())))), |
715 | | |
716 | 4.38k | ("verus::vstd::atomic::atomically", VerusItem::Spec(SpecItem::Atomically)), |
717 | 4.38k | ("verus::vstd::atomic::pred_args", VerusItem::Vstd(VstdItem::PredArgs, Some(Arc::new("atomic::pred_args".to_owned())))), |
718 | 4.38k | ("verus::vstd::atomic::branch_bool", VerusItem::Vstd(VstdItem::BranchBool, Some(Arc::new("atomic::branch_bool".to_owned())))), |
719 | 4.38k | ("verus::vstd::atomic::AtomicUpdate::req", VerusItem::Vstd(VstdItem::AtomicUpdate(AtomicUpdateItem::AtomicUpdateReq), Some(Arc::new("atomic::AtomicUpdate::req".to_owned())))), |
720 | 4.38k | ("verus::vstd::atomic::AtomicUpdate::ens", VerusItem::Vstd(VstdItem::AtomicUpdate(AtomicUpdateItem::AtomicUpdateEns), Some(Arc::new("atomic::AtomicUpdate::ens".to_owned())))), |
721 | 4.38k | ("verus::vstd::atomic::AtomicUpdate::pred", VerusItem::Vstd(VstdItem::AtomicUpdate(AtomicUpdateItem::AtomicUpdatePred), Some(Arc::new("atomic::AtomicUpdate::pred".to_owned())))), |
722 | 4.38k | ("verus::vstd::atomic::AtomicUpdate::resolves", VerusItem::Vstd(VstdItem::AtomicUpdate(AtomicUpdateItem::AtomicUpdateResolves), Some(Arc::new("atomic::AtomicUpdate::resolves".to_owned())))), |
723 | 4.38k | ("verus::vstd::atomic::AtomicUpdate::input", VerusItem::Vstd(VstdItem::AtomicUpdate(AtomicUpdateItem::AtomicUpdateInput), Some(Arc::new("atomic::AtomicUpdate::input".to_owned())))), |
724 | 4.38k | ("verus::vstd::atomic::AtomicUpdate::output", VerusItem::Vstd(VstdItem::AtomicUpdate(AtomicUpdateItem::AtomicUpdateOutput), Some(Arc::new("atomic::AtomicUpdate::output".to_owned())))), |
725 | 4.38k | ("verus::vstd::atomic::AtomicUpdate::outer_mask", VerusItem::Vstd(VstdItem::AtomicUpdate(AtomicUpdateItem::AtomicUpdateOuterMask), Some(Arc::new("atomic::AtomicUpdate::outer_mask".to_owned())))), |
726 | 4.38k | ("verus::vstd::atomic::AtomicUpdate::inner_mask", VerusItem::Vstd(VstdItem::AtomicUpdate(AtomicUpdateItem::AtomicUpdateInnerMask), Some(Arc::new("atomic::AtomicUpdate::inner_mask".to_owned())))), |
727 | | |
728 | 4.38k | ("verus::vstd::std_specs::vec::vec_index", VerusItem::Vstd(VstdItem::VecIndex, Some(Arc::new("std_specs::vec::vec_index".to_owned())))), |
729 | 4.38k | ("verus::vstd::std_specs::vec::vec_index_mut", VerusItem::Vstd(VstdItem::VecIndexMut, Some(Arc::new("std_specs::vec::vec_index_mut".to_owned())))), |
730 | 4.38k | ("verus::vstd::array::array_index_get", VerusItem::Vstd(VstdItem::ArrayIndexGet, Some(Arc::new("array::array_index_get".to_owned())))), |
731 | 4.38k | ("verus::vstd::array::array_as_slice", VerusItem::Vstd(VstdItem::ArrayAsSlice, Some(Arc::new("array::array_as_slice".to_owned())))), |
732 | 4.38k | ("verus::vstd::array::array_fill_for_copy_types", VerusItem::Vstd(VstdItem::ArrayFillForCopyTypes, Some(Arc::new("array::array_fill_for_copy_types".to_owned())))), |
733 | 4.38k | ("verus::vstd::array::ref_mut_array_unsizing_coercion", VerusItem::Vstd(VstdItem::RefMutArrayUnsizingCoercion, Some(Arc::new("array::ref_mut_array_unsizing_coercion".to_owned())))), |
734 | 4.38k | ("verus::vstd::array::spec_array_update", VerusItem::Vstd(VstdItem::SpecArrayUpdate, Some(Arc::new("array::spec_array_update".to_owned())))), |
735 | 4.38k | ("verus::vstd::slice::slice_index_get", VerusItem::Vstd(VstdItem::SliceIndexGet, Some(Arc::new("slice::slice_index_get".to_owned())))), |
736 | 4.38k | ("verus::vstd::slice::spec_slice_update", VerusItem::Vstd(VstdItem::SpecSliceUpdate, Some(Arc::new("slice::spec_slice_update".to_owned())))), |
737 | 4.38k | ("verus::vstd::slice::spec_slice_len", VerusItem::Vstd(VstdItem::SpecSliceLen, Some(Arc::new("slice::spec_slice_len".to_owned())))), |
738 | 4.38k | ("verus::vstd::slice::spec_slice_index", VerusItem::Vstd(VstdItem::SpecSliceIndex, Some(Arc::new("slice::spec_slice_index".to_owned())))), |
739 | 4.38k | ("verus::vstd::raw_ptr::cast_ptr_to_thin_ptr", VerusItem::Vstd(VstdItem::CastPtrToThinPtr, Some(Arc::new("raw_ptr::cast_ptr_to_thin_ptr".to_owned())))), |
740 | 4.38k | ("verus::vstd::raw_ptr::cast_array_ptr_to_slice_ptr", VerusItem::Vstd(VstdItem::CastArrayPtrToSlicePtr, Some(Arc::new("raw_ptr::cast_array_ptr_to_slice_ptr".to_owned())))), |
741 | 4.38k | ("verus::vstd::raw_ptr::cast_slice_ptr_to_slice_ptr", VerusItem::Vstd(VstdItem::CastSlicePtrToSlicePtr, Some(Arc::new("raw_ptr::cast_slice_ptr_to_slice_ptr".to_owned())))), |
742 | 4.38k | ("verus::vstd::raw_ptr::cast_slice_ptr_to_str_ptr", VerusItem::Vstd(VstdItem::CastSlicePtrToStrPtr, Some(Arc::new("raw_ptr::cast_slice_ptr_to_str_ptr".to_owned())))), |
743 | 4.38k | ("verus::vstd::raw_ptr::cast_str_ptr_to_slice_ptr", VerusItem::Vstd(VstdItem::CastStrPtrToSlicePtr, Some(Arc::new("raw_ptr::cast_str_ptr_to_slice_ptr".to_owned())))), |
744 | 4.38k | ("verus::vstd::raw_ptr::cast_ptr_to_usize", VerusItem::Vstd(VstdItem::CastPtrToUsize, Some(Arc::new("raw_ptr::cast_ptr_to_usize".to_owned())))), |
745 | 4.38k | ("verus::vstd::raw_ptr::SharedReference", VerusItem::Vstd(VstdItem::SharedReference, Some(Arc::new("raw_ptr::SharedReference".to_owned())))), |
746 | 4.38k | ("verus::vstd::float::float_cast", VerusItem::Vstd(VstdItem::FloatCast, Some(Arc::new("float::float_cast".to_owned())))), |
747 | | // SeqFn(vir::interpreter::SeqFn::Last ))), |
748 | | |
749 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument", VerusItem::RustPrivate(RustPrivate::Path(vir::path!(CrateId::Core => "fmt", "rt", "Argument")))), |
750 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument::new_binary", VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(Arc::new("new_binary".to_owned())))), |
751 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument::new_debug", VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(Arc::new("new_debug".to_owned())))), |
752 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument::new_debug_noop", VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(Arc::new("new_debug_noop".to_owned())))), |
753 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument::new_display", VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(Arc::new("new_display".to_owned())))), |
754 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument::new_lower_exp", VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(Arc::new("new_lower_exp".to_owned())))), |
755 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument::new_lower_hex", VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(Arc::new("new_lower_hex".to_owned())))), |
756 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument::new_octal", VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(Arc::new("new_octal".to_owned())))), |
757 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument::new_pointer", VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(Arc::new("new_pointer".to_owned())))), |
758 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument::new_upper_exp", VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(Arc::new("new_upper_exp".to_owned())))), |
759 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument::new_upper_hex", VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(Arc::new("new_upper_hex".to_owned())))), |
760 | 4.38k | ("verus::vstd::std_specs::fmt::rt::Argument::from_usize", VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(Arc::new("from_usize".to_owned())))), |
761 | 4.38k | ("verus::vstd::std_specs::fmt::Arguments::new", VerusItem::RustPrivate(RustPrivate::FormatArgumentsFn(Arc::new("new".to_owned())))), |
762 | | |
763 | 4.38k | ("verus::verus_builtin::Structural", VerusItem::Marker(MarkerItem::Structural)), |
764 | | |
765 | 4.38k | ("verus::verus_builtin::int", VerusItem::BuiltinType(BuiltinTypeItem::Int)), |
766 | 4.38k | ("verus::verus_builtin::nat", VerusItem::BuiltinType(BuiltinTypeItem::Nat)), |
767 | 4.38k | ("verus::verus_builtin::real", VerusItem::BuiltinType(BuiltinTypeItem::Real)), |
768 | 4.38k | ("verus::verus_builtin::FnSpec", VerusItem::BuiltinType(BuiltinTypeItem::FnSpec)), |
769 | 4.38k | ("verus::verus_builtin::Ghost", VerusItem::BuiltinType(BuiltinTypeItem::Ghost)), |
770 | 4.38k | ("verus::verus_builtin::Tracked", VerusItem::BuiltinType(BuiltinTypeItem::Tracked)), |
771 | | |
772 | 4.38k | ("verus::verus_builtin::Integer", VerusItem::BuiltinTrait(BuiltinTraitItem::Integer)), |
773 | 4.38k | ("verus::verus_builtin::Chainable", VerusItem::BuiltinTrait(BuiltinTraitItem::Chainable)), |
774 | 4.38k | ("verus::verus_builtin::private::Sealed", VerusItem::BuiltinTrait(BuiltinTraitItem::Sealed)), |
775 | | |
776 | 4.38k | ("verus::verus_builtin::call_requires", VerusItem::BuiltinFunction(BuiltinFunctionItem::CallRequires)), |
777 | 4.38k | ("verus::verus_builtin::call_ensures", VerusItem::BuiltinFunction(BuiltinFunctionItem::CallEnsures)), |
778 | 4.38k | ("verus::verus_builtin::constrain_type", VerusItem::BuiltinFunction(BuiltinFunctionItem::ConstrainType)), |
779 | 4.38k | ("verus::verus_builtin::get_future_output_type", VerusItem::BuiltinFunction(BuiltinFunctionItem::GetFutureOutputType)), |
780 | | |
781 | 4.38k | ("verus::verus_builtin::global_size_of", VerusItem::Global(GlobalItem::SizeOf)), |
782 | | |
783 | 4.38k | ("verus::verus_builtin::FnProof", VerusItem::External(ExternalItem::FnProof)), |
784 | 4.38k | ("verus::verus_builtin::FOpts", VerusItem::External(ExternalItem::FOpts)), |
785 | 4.38k | ("verus::verus_builtin::ProofFnReqEnsDef::req", VerusItem::External(ExternalItem::FnProofReq)), |
786 | 4.38k | ("verus::verus_builtin::ProofFnReqEnsDef::ens", VerusItem::External(ExternalItem::FnProofEns)), |
787 | 4.38k | ("verus::verus_builtin::ProofFnOnce", VerusItem::External(ExternalItem::ProofFnOnce)), |
788 | 4.38k | ("verus::verus_builtin::ProofFnMut", VerusItem::External(ExternalItem::ProofFnMut)), |
789 | 4.38k | ("verus::verus_builtin::ProofFn", VerusItem::External(ExternalItem::ProofFn)), |
790 | 4.38k | ("verus::verus_builtin::Trk", VerusItem::External(ExternalItem::Trk)), |
791 | 4.38k | ("verus::verus_builtin::RqEn", VerusItem::External(ExternalItem::RqEn)), |
792 | 4.38k | ("verus::verus_builtin::has_resolved", VerusItem::HasResolved), |
793 | 4.38k | ("verus::verus_builtin::has_resolved_unsized", VerusItem::HasResolvedUnsized), |
794 | 4.38k | ("verus::verus_builtin::mut_ref_current", VerusItem::MutRefCurrent), |
795 | 4.38k | ("verus::verus_builtin::mut_ref_future", VerusItem::MutRefFuture), |
796 | 4.38k | ("verus::verus_builtin::final_", VerusItem::Final), |
797 | 4.38k | ("verus::verus_builtin::after_borrow", VerusItem::AfterBorrow), |
798 | 4.38k | ("verus::verus_builtin::mut_ref_tracked", VerusItem::MutRefTracked), |
799 | | ] |
800 | 4.38k | } |
801 | | |
802 | | pub(crate) struct VerusItems { |
803 | | pub(crate) id_to_name: HashMap<DefId, VerusItem>, |
804 | | pub(crate) name_to_id: HashMap<VerusItem, DefId>, |
805 | | // RustPrivate items also map to an underlying Rust DefId (in addition to the Verus DefId): |
806 | | pub(crate) name_to_rust_private_id: HashMap<VerusItem, DefId>, |
807 | | } |
808 | | |
809 | 4.38k | pub(crate) fn from_diagnostic_items(tcx: TyCtxt) -> VerusItems { |
810 | 4.38k | let diagnostic_items = &tcx.all_diagnostic_items(()); |
811 | 4.38k | let verus_item_map: HashMap<&str, VerusItem> = verus_items_map().into_iter().collect(); |
812 | 4.38k | let diagnostic_name_to_id = &diagnostic_items.name_to_id; |
813 | 4.38k | let mut id_to_name: HashMap<DefId, VerusItem> = HashMap::new(); |
814 | 4.38k | let mut name_to_id: HashMap<VerusItem, DefId> = HashMap::new(); |
815 | 4.38k | let mut name_to_rust_private_id: HashMap<VerusItem, DefId> = HashMap::new(); |
816 | 2.96M | for (name, id) in diagnostic_name_to_id { |
817 | 2.96M | let name = name.as_str(); |
818 | 2.96M | if name.starts_with("verus::verus_builtin") || name.starts_with("verus::vstd") { |
819 | 913k | let Some(item) = verus_item_map.get(name) else { |
820 | 0 | panic!("unexpected verus diagnostic item {}", name); |
821 | | }; |
822 | 913k | id_to_name.insert(id.clone(), item.clone()); |
823 | 913k | name_to_id.insert(item.clone(), id.clone()); |
824 | 913k | let lang_item_name = match item { |
825 | 18.9k | VerusItem::RustPrivate(RustPrivate::FormatArgumentFn(name)) => { |
826 | 18.9k | Some((rustc_hir::LangItem::FormatArgument, name.clone())) |
827 | | } |
828 | 1.72k | VerusItem::RustPrivate(RustPrivate::FormatArgumentsFn(name)) => { |
829 | 1.72k | Some((rustc_hir::LangItem::FormatArguments, name.clone())) |
830 | | } |
831 | 893k | _ => None, |
832 | | }; |
833 | 913k | if let Some((lang_item, name)) = lang_item_name { |
834 | 20.6k | let lang_id = tcx.require_lang_item(lang_item, rustc_span::DUMMY_SP); |
835 | 20.6k | let mut fn_id = None; |
836 | 24.0k | for imp in tcx.inherent_impls(lang_id) { |
837 | 24.0k | let symbol = rustc_span::Symbol::intern(&*name); |
838 | 24.0k | for item in tcx.associated_items(*imp).filter_by_name_unhygienic(symbol) { |
839 | 20.6k | assert!(fn_id.is_none()); |
840 | 20.6k | fn_id = Some(item.def_id); |
841 | | } |
842 | | } |
843 | 20.6k | let Some(fn_id) = fn_id else { |
844 | 0 | panic!("could find Rust library function {:?} {}", lang_id, name); |
845 | | }; |
846 | 20.6k | name_to_rust_private_id.insert(item.clone(), fn_id); |
847 | 893k | } |
848 | 2.05M | } |
849 | | } |
850 | 4.38k | VerusItems { id_to_name, name_to_id, name_to_rust_private_id } |
851 | 4.38k | } |
852 | | |
853 | | #[derive(PartialEq, Eq, Debug, Clone, Copy)] |
854 | | pub(crate) enum RustIntType { |
855 | | U8, |
856 | | U16, |
857 | | U32, |
858 | | U64, |
859 | | U128, |
860 | | USize, |
861 | | |
862 | | I8, |
863 | | I16, |
864 | | I32, |
865 | | I64, |
866 | | I128, |
867 | | ISize, |
868 | | } |
869 | | |
870 | | #[derive(PartialEq, Eq, Debug, Clone, Copy)] |
871 | | pub(crate) enum RustIntConst { |
872 | | Min, |
873 | | Max, |
874 | | Bits, |
875 | | } |
876 | | |
877 | | #[derive(PartialEq, Eq, Debug, Clone, Copy)] |
878 | | pub(crate) struct RustIntIntrinsicItem(pub(crate) RustIntType, pub(crate) RustIntConst); |
879 | | |
880 | | #[derive(PartialEq, Eq, Debug, Clone, Copy)] |
881 | | pub(crate) enum RustItem { |
882 | | Panic, |
883 | | Box, |
884 | | Fn, |
885 | | FnOnce, |
886 | | FnMut, |
887 | | Drop, |
888 | | Sized, |
889 | | Copy, |
890 | | Send, |
891 | | Sync, |
892 | | Any, |
893 | | Clone, |
894 | | StructuralPartialEq, |
895 | | Eq, |
896 | | PartialEq, |
897 | | Ord, |
898 | | PartialOrd, |
899 | | Hash, |
900 | | Default, |
901 | | Debug, |
902 | | Rc, |
903 | | Arc, |
904 | | BoxNew, |
905 | | ArcNew, |
906 | | RcNew, |
907 | | CloneClone, |
908 | | CloneFrom, |
909 | | IntIntrinsic(RustIntIntrinsicItem), |
910 | | TryTraitBranch, |
911 | | ResidualTraitFromResidual, |
912 | | IntoIterFn, |
913 | | ManuallyDrop, |
914 | | PhantomData, |
915 | | Destruct, |
916 | | SliceSealed, |
917 | | Vec, |
918 | | Thin, |
919 | | } |
920 | | |
921 | 4.81M | pub(crate) fn get_rust_item<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Option<RustItem> { |
922 | | // if tcx.parent(def_id) == partial_eq { |
923 | 4.81M | if tcx.lang_items().panic_fn() == Some(def_id) { |
924 | 13.6k | return Some(RustItem::Panic); |
925 | 4.79M | } |
926 | 4.79M | if tcx.lang_items().owned_box() == Some(def_id) { |
927 | 11.3k | return Some(RustItem::Box); |
928 | 4.78M | } |
929 | 4.78M | if tcx.lang_items().fn_trait() == Some(def_id) { |
930 | 1 | return Some(RustItem::Fn); |
931 | 4.78M | } |
932 | 4.78M | if tcx.lang_items().fn_mut_trait() == Some(def_id) { |
933 | 217 | return Some(RustItem::FnMut); |
934 | 4.78M | } |
935 | 4.78M | if tcx.lang_items().fn_once_trait() == Some(def_id) { |
936 | 435 | return Some(RustItem::FnOnce); |
937 | 4.78M | } |
938 | 4.78M | if tcx.lang_items().drop_trait() == Some(def_id) { |
939 | 8 | return Some(RustItem::Drop); |
940 | 4.78M | } |
941 | 4.78M | if tcx.lang_items().structural_peq_trait() == Some(def_id) { |
942 | 728 | return Some(RustItem::StructuralPartialEq); |
943 | 4.78M | } |
944 | 4.78M | if tcx.lang_items().eq_trait() == Some(def_id) { |
945 | 842 | return Some(RustItem::PartialEq); |
946 | 4.78M | } |
947 | 4.78M | if tcx.lang_items().branch_fn() == Some(def_id) { |
948 | 65 | return Some(RustItem::TryTraitBranch); |
949 | 4.78M | } |
950 | 4.78M | if tcx.lang_items().from_residual_fn() == Some(def_id) { |
951 | 65 | return Some(RustItem::ResidualTraitFromResidual); |
952 | 4.78M | } |
953 | 4.78M | if tcx.lang_items().into_iter_fn() == Some(def_id) { |
954 | 230 | return Some(RustItem::IntoIterFn); |
955 | 4.78M | } |
956 | 4.78M | if tcx.lang_items().manually_drop() == Some(def_id) { |
957 | 1.82k | return Some(RustItem::ManuallyDrop); |
958 | 4.78M | } |
959 | 4.78M | if tcx.lang_items().phantom_data() == Some(def_id) { |
960 | 4.35k | return Some(RustItem::PhantomData); |
961 | 4.77M | } |
962 | 4.77M | if tcx.lang_items().destruct_trait() == Some(def_id) { |
963 | 542 | return Some(RustItem::Destruct); |
964 | 4.77M | } |
965 | 4.77M | if tcx.lang_items().partial_ord_trait() == Some(def_id) { |
966 | 1.08k | return Some(RustItem::PartialOrd); |
967 | 4.77M | } |
968 | 4.77M | let rust_path = def_id_to_stable_rust_path(tcx, def_id); |
969 | 4.77M | let rust_path = rust_path.as_ref().map(|x| x.as_str()); |
970 | 4.77M | get_rust_item_str(rust_path) |
971 | 4.81M | } |
972 | | |
973 | | #[allow(dead_code)] |
974 | 0 | pub(crate) fn get_rust_item_path(rust_path: &vir::ast::Path) -> Option<RustItem> { |
975 | 0 | get_rust_item_str(Some(&vir::ast_util::path_as_friendly_rust_name(rust_path))) |
976 | 0 | } |
977 | | |
978 | 4.77M | pub(crate) fn get_rust_item_str(rust_path: Option<&str>) -> Option<RustItem> { |
979 | | // We could use rust's diagnostic_items for these, but they are only defined when cfg(not(test)) |
980 | | // and they may get changed without us noticing, so we are using paths instead |
981 | 4.77M | if rust_path == Some("core::cmp::Eq") { |
982 | 1.40k | return Some(RustItem::Eq); |
983 | 4.77M | } |
984 | 4.77M | if rust_path == Some("alloc::rc::Rc") { |
985 | 3.48k | return Some(RustItem::Rc); |
986 | 4.77M | } |
987 | 4.77M | if rust_path == Some("alloc::sync::Arc") { |
988 | 3.08k | return Some(RustItem::Arc); |
989 | 4.76M | } |
990 | | |
991 | 4.76M | if rust_path == Some("alloc::boxed::Box::new") { |
992 | 446 | return Some(RustItem::BoxNew); |
993 | 4.76M | } |
994 | 4.76M | if rust_path == Some("alloc::sync::Arc::new") { |
995 | 40 | return Some(RustItem::ArcNew); |
996 | 4.76M | } |
997 | 4.76M | if rust_path == Some("alloc::rc::Rc::new") { |
998 | 36 | return Some(RustItem::RcNew); |
999 | 4.76M | } |
1000 | | |
1001 | 4.76M | if rust_path == Some("core::marker::Sized") { |
1002 | 29.2k | return Some(RustItem::Sized); |
1003 | 4.73M | } |
1004 | 4.73M | if rust_path == Some("core::marker::Send") { |
1005 | 58 | return Some(RustItem::Send); |
1006 | 4.73M | } |
1007 | 4.73M | if rust_path == Some("core::marker::Sync") { |
1008 | 28 | return Some(RustItem::Sync); |
1009 | 4.73M | } |
1010 | 4.73M | if rust_path == Some("core::marker::Copy") { |
1011 | 641 | return Some(RustItem::Copy); |
1012 | 4.73M | } |
1013 | 4.73M | if rust_path == Some("core::clone::Clone") { |
1014 | 2.95k | return Some(RustItem::Clone); |
1015 | 4.73M | } |
1016 | 4.73M | if rust_path == Some("core::clone::Clone::clone") { |
1017 | 875 | return Some(RustItem::CloneClone); |
1018 | 4.73M | } |
1019 | 4.73M | if rust_path == Some("core::clone::Clone::clone_from") { |
1020 | 0 | return Some(RustItem::CloneFrom); |
1021 | 4.73M | } |
1022 | | |
1023 | 4.73M | if rust_path == Some("core::slice::index::private_slice_index::Sealed") { |
1024 | 81 | return Some(RustItem::SliceSealed); |
1025 | 4.73M | } |
1026 | 4.73M | if rust_path == Some("core::fmt::Debug") { |
1027 | 325 | return Some(RustItem::Debug); |
1028 | 4.73M | } |
1029 | 4.73M | if rust_path == Some("core::hash::Hash") { |
1030 | 957 | return Some(RustItem::Hash); |
1031 | 4.73M | } |
1032 | 4.73M | if rust_path == Some("core::default::Default") { |
1033 | 586 | return Some(RustItem::Default); |
1034 | 4.73M | } |
1035 | 4.73M | if rust_path == Some("core::cmp::Ord") { |
1036 | 842 | return Some(RustItem::Ord); |
1037 | 4.73M | } |
1038 | 4.73M | if rust_path == Some("alloc::vec::Vec") { |
1039 | 25.2k | return Some(RustItem::Vec); |
1040 | 4.70M | } |
1041 | 4.70M | if rust_path == Some("core::ptr::metadata::Thin") { |
1042 | 2 | return Some(RustItem::Thin); |
1043 | 4.70M | } |
1044 | 4.70M | if rust_path == Some("core::any::Any") { |
1045 | 0 | return Some(RustItem::Any); |
1046 | 4.70M | } |
1047 | | |
1048 | 4.70M | if let Some(rust_path) = rust_path { |
1049 | | static NUM_RE: std::sync::OnceLock<Regex> = std::sync::OnceLock::new(); |
1050 | 4.70M | let num_re = |
1051 | 4.70M | NUM_RE.get_or_init(|| Regex::new(r"^([A-Za-z0-9_]+)::(MIN|MAX|BITS)").unwrap()); |
1052 | 4.70M | if let Some(captures) = num_re.captures(rust_path) { |
1053 | 21.4k | let ty_name = captures.get(1).expect("invalid int intrinsic regex"); |
1054 | 21.4k | let const_name = captures.get(2).expect("invalid int intrinsic regex"); |
1055 | | use RustIntType::*; |
1056 | 21.4k | let ty = match ty_name.as_str() { |
1057 | 21.4k | "u8" => Some(U8), |
1058 | 19.5k | "u16" => Some(U16), |
1059 | 17.7k | "u32" => Some(U32), |
1060 | 15.9k | "u64" => Some(U64), |
1061 | 14.1k | "u128" => Some(U128), |
1062 | 12.7k | "usize" => Some(USize), |
1063 | | |
1064 | 9.31k | "i8" => Some(I8), |
1065 | 7.53k | "i16" => Some(I16), |
1066 | 5.87k | "i32" => Some(I32), |
1067 | 4.26k | "i64" => Some(I64), |
1068 | 2.81k | "i128" => Some(I128), |
1069 | 1.63k | "isize" => Some(ISize), |
1070 | | |
1071 | 0 | _ => None, |
1072 | | }; |
1073 | 21.4k | return ty.map(|ty| { |
1074 | 21.4k | let const_ = match const_name.as_str() { |
1075 | 21.4k | "MIN" => RustIntConst::Min, |
1076 | 13.2k | "MAX" => RustIntConst::Max, |
1077 | 2.97k | "BITS" => RustIntConst::Bits, |
1078 | | |
1079 | 0 | _ => panic!("unexpected int const"), |
1080 | | }; |
1081 | 21.4k | RustItem::IntIntrinsic(RustIntIntrinsicItem(ty, const_)) |
1082 | 21.4k | }); |
1083 | 4.68M | } |
1084 | 1.68k | } |
1085 | | |
1086 | 4.68M | None |
1087 | 4.77M | } |