diff --git a/src/eval_context.rs b/src/eval_context.rs index 1bf71e149dc..fb83eff502a 100644 --- a/src/eval_context.rs +++ b/src/eval_context.rs @@ -1510,7 +1510,13 @@ pub fn eval_main<'a, 'tcx: 'a>( loop { match ecx.step() { Ok(true) => {} - Ok(false) => return, + Ok(false) => { + let leaks = ecx.memory.leak_report(); + if leaks != 0 { + tcx.sess.err("the evaluated program leaked memory"); + } + return; + } Err(e) => { report(tcx, &ecx, e); return; diff --git a/src/memory.rs b/src/memory.rs index 0c7b4971e1d..459a9bed412 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -585,6 +585,23 @@ impl<'a, 'tcx> Memory<'a, 'tcx> { } } } + + pub fn leak_report(&self) -> usize { + trace!("### LEAK REPORT ###"); + let leaks: Vec<_> = self.alloc_map + .iter() + .filter_map(|(&key, val)| { + if val.static_kind == StaticKind::NotStatic { + Some(key) + } else { + None + } + }) + .collect(); + let n = leaks.len(); + self.dump_allocs(leaks); + n + } } fn dump_fn_def<'tcx>(fn_def: FunctionDefinition<'tcx>) -> String {