charon_lib/transform/resugar/
move_asserts_to_statements.rs1use crate::ast::*;
10use crate::transform::TransformCtx;
11use crate::ullbc_ast::{ExprBody, Statement, StatementKind, TerminatorKind};
12
13use crate::transform::ctx::UllbcPass;
14
15pub struct Transform;
16impl UllbcPass for Transform {
17 fn should_run(&self, options: &crate::options::TranslateOptions) -> bool {
18 options.reconstruct_fallible_operations
19 }
20
21 fn transform_body(&self, _ctx: &mut TransformCtx, b: &mut ExprBody) {
22 let panics = b.as_abort_map();
26
27 for block in b.body.iter_mut() {
28 let TerminatorKind::Assert {
29 assert:
30 Assert {
31 check_kind: Some(_),
32 ..
33 },
34 target,
35 ..
36 } = &block.terminator.kind
37 else {
38 continue;
39 };
40
41 let new_terminator = TerminatorKind::Goto { target: *target };
42 let old_terminator = std::mem::replace(&mut block.terminator.kind, new_terminator);
43 let TerminatorKind::Assert {
44 assert, on_unwind, ..
45 } = old_terminator
46 else {
47 unreachable!();
48 };
49
50 let on_failure = panics
51 .get(&on_unwind)
52 .cloned()
53 .unwrap_or(AbortKind::Panic(None));
54
55 block.statements.push(Statement {
56 kind: StatementKind::Assert { assert, on_failure },
57 span: block.terminator.span,
58 comments_before: block.terminator.comments_before.clone(),
59 });
60 }
61 }
62}