From 18fe30f39c385a0226126a82cc44253b9efa4fee Mon Sep 17 00:00:00 2001 From: Shunsuke Shibayama Date: Tue, 4 Oct 2022 00:54:52 +0900 Subject: [PATCH] Update effectcheck.rs --- compiler/erg_compiler/effectcheck.rs | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/compiler/erg_compiler/effectcheck.rs b/compiler/erg_compiler/effectcheck.rs index e96a2699..3c5b9e3e 100644 --- a/compiler/erg_compiler/effectcheck.rs +++ b/compiler/erg_compiler/effectcheck.rs @@ -170,18 +170,6 @@ impl SideEffectChecker { } fn check_def(&mut self, def: &Def) { - if !def.sig.is_subr() { - let expr = def.body.block.last().unwrap(); - if !def.sig.is_procedural() && expr.t().is_procedural() { - self.errs.push(EffectError::proc_assign_error( - self.cfg.input.clone(), - line!() as usize, - &def.sig, - self.full_path(), - )); - } - return; - } let name_and_vis = match &def.sig { Signature::Var(var) => (var.inspect().clone(), var.vis()), Signature::Subr(subr) => (subr.ident.inspect().clone(), subr.ident.vis()), @@ -211,8 +199,22 @@ impl SideEffectChecker { self.block_stack.push(ConstInstant); } } - for chunk in def.body.block.iter() { + let last_idx = def.body.block.len() - 1; + for (i, chunk) in def.body.block.iter().enumerate() { self.check_expr(chunk); + // e.g. `echo = print!` + if i == last_idx + && self.block_stack.last().unwrap() == &Instant + && !def.sig.is_procedural() + && chunk.t().is_procedural() + { + self.errs.push(EffectError::proc_assign_error( + self.cfg.input.clone(), + line!() as usize, + &def.sig, + self.full_path(), + )); + } } self.path_stack.pop(); self.block_stack.pop();