From e7ca2ab9e12e34c346b033ec6862f2d7cb5228f0 Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 22 Jan 2018 18:37:16 +0100 Subject: [PATCH] catch undefined variables in return statements --- src/semantics.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/semantics.rs b/src/semantics.rs index d55da048..3def7524 100644 --- a/src/semantics.rs +++ b/src/semantics.rs @@ -183,7 +183,10 @@ impl Checker { Ok(()) } Expression::Number(_) => Ok(()), - Expression::List(values) => { + Expression::List(exprs) => { + for expr in exprs { + self.check_expression(expr)? + } Ok(()) } } @@ -443,4 +446,27 @@ mod tests { let mut checker = Checker::new_with_args(HashSet::new(), 0, HashSet::new()); assert_eq!(checker.check_function(bar), Err(("Function definition for function ??? with ??? argument(s) not found.".to_string()))); } + + #[test] + fn return_undefined() { + // def bar(): + // return a, b + // should fail + let bar_statements: Vec> = vec![Statement::Return( + Expression::List(vec![ + Expression::Identifier("a".to_string()), + Expression::Identifier("b".to_string()) + ]) + )]; + + let bar = Function { + id: "bar".to_string(), + arguments: vec![], + statements: bar_statements, + return_count: 2 + }; + + let mut checker = Checker::new_with_args(HashSet::new(), 0, HashSet::new()); + assert_eq!(checker.check_function(bar), Err(("\"a\" is undefined".to_string()))); + } } \ No newline at end of file