use super::super::*;
#[test]
fn eliminate_dead_temps_strips_unused_arithmetic_expression() {
let mut statements = vec!["let t1 = loc1 * 3;".to_string(), "return;".to_string()];
HighLevelEmitter::eliminate_dead_temps(&mut statements);
assert!(
statements[0].is_empty(),
"dead temp with arithmetic rhs should be cleared: {statements:?}"
);
assert_eq!(statements[1], "return;");
}
#[test]
fn eliminate_dead_temps_keeps_calls_for_their_side_effects() {
let mut statements = vec![
"let t0 = syscall(\"System.Storage.Get\", t1);".to_string(),
"return;".to_string(),
];
HighLevelEmitter::eliminate_dead_temps(&mut statements);
assert_eq!(
statements[0], "let t0 = syscall(\"System.Storage.Get\", t1);",
"temps holding call results must not be eliminated: {statements:?}"
);
}
#[test]
fn eliminate_dead_temps_keeps_used_temps() {
let mut statements = vec!["let t0 = loc1 + 1;".to_string(), "return t0;".to_string()];
HighLevelEmitter::eliminate_dead_temps(&mut statements);
assert_eq!(statements[0], "let t0 = loc1 + 1;");
assert_eq!(statements[1], "return t0;");
}
#[test]
fn eliminate_dead_temps_keeps_potentially_throwing_division_or_indexing() {
let mut statements = vec![
"let t0 = a / b;".to_string(),
"let t1 = c % d;".to_string(),
"let t2 = arr[i];".to_string(),
"return;".to_string(),
];
HighLevelEmitter::eliminate_dead_temps(&mut statements);
assert_eq!(statements[0], "let t0 = a / b;");
assert_eq!(statements[1], "let t1 = c % d;");
assert_eq!(statements[2], "let t2 = arr[i];");
}