diff --git a/examples/scopes.rs b/examples/scopes.rs new file mode 100644 index 0000000000000000000000000000000000000000..9dac1e17fa92407ae7e4777f790495105da527c9 --- /dev/null +++ b/examples/scopes.rs @@ -0,0 +1,12 @@ +fn main() { + let mut a = 7; + let mut b; + { + a = 5; + b = false; + let mut a = false; + a = true; + }; + a = 0; + b = true; +} diff --git a/examples/scopes_err.rs b/examples/scopes_err.rs new file mode 100644 index 0000000000000000000000000000000000000000..ef2d7f67970f7363a647a91b42c137c02411a1d9 --- /dev/null +++ b/examples/scopes_err.rs @@ -0,0 +1,12 @@ +fn main() { + let mut a = 7; + let mut b; + { + a = 5; + b = false; + let mut a = false; + a = true; + }; + a = false; + b = true; +} diff --git a/src/vm.rs b/src/vm.rs index 8e0aa6236ec2a6028fad615754f7087ea7a92f6a..bfe900508a628864a6e2c71a07247aaeb0b10c00 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -286,7 +286,7 @@ fn eval_stmts(stmts: &Stmts, m: &mut Mem, fn_env: &FnEnv) -> Val { println!("block"); eval_stmts(block, m, fn_env) } - Stmt::Semi => panic!("ICE"), + Stmt::Semi => Val::Unit, } } m.pop_scope(); diff --git a/tests/test_parser.rs b/tests/test_parser.rs index f7e0dc4180c11efdca98bafcd113d57aa4a8fa3c..67881ff6dc33e15b53568e7b622ff6665109ef12 100644 --- a/tests/test_parser.rs +++ b/tests/test_parser.rs @@ -56,36 +56,37 @@ fn test_exprs() { #[test] fn test_stmts() { // test empty sequence - assert!(BlockParser::new().parse("").is_ok()); + assert!(BlockParser::new().parse("{}").is_ok()); // test let with no assignment and inferred type - assert!(BlockParser::new().parse("let a").is_ok()); + assert!(BlockParser::new().parse("{ let a }").is_ok()); // test let with no assignment and excplicit type - assert!(BlockParser::new().parse("let a : u32").is_ok()); + assert!(BlockParser::new().parse("{ let a : u32 }").is_ok()); // test let with inferred type - assert!(BlockParser::new().parse("let a = 0").is_ok()); + assert!(BlockParser::new().parse("{ let a = 0 }").is_ok()); // test let with explicit type - assert!(BlockParser::new().parse("let a : u16 = 1 + 2").is_ok()); + assert!(BlockParser::new().parse("{ let a : u16 = 1 + 2 }").is_ok()); // test assignment - assert!(BlockParser::new().parse("a = 1 + 2").is_ok()); + assert!(BlockParser::new().parse("{ a = 1 + 2 }").is_ok()); // test assignment - assert!(BlockParser::new().parse("*a = 1 + 2").is_ok()); + assert!(BlockParser::new().parse("{ *a = 1 + 2}").is_ok()); // test if then - assert!(BlockParser::new().parse("if a { b = 5 }").is_ok()); + assert!(BlockParser::new().parse("{ if a { b = 5 } }").is_ok()); // test if then else assert!(BlockParser::new() - .parse("if a { b = 5 } else { b = 7 }") + .parse("{ if a { b = 5 } else { b = 7 } }") .is_ok()); + // test hello assert!(BlockParser::new() - .parse("while hello(b) { b = b - 5 }") + .parse("{ while hello(b) { b = b - 5 } }") .is_ok()); } diff --git a/tests/test_vm.rs b/tests/test_vm.rs index 33d77295160878024b5784eb8dae75c171cdf049..f8998fc43791ae55156d24cbefcc400d09dffcf0 100644 --- a/tests/test_vm.rs +++ b/tests/test_vm.rs @@ -55,13 +55,13 @@ fn while_test() { } #[test] -fn mut_test() { - eval_prog("examples/mut.rs"); +fn let_test() { + eval_prog("examples/let.rs"); } #[test] -fn mut2_test() { - eval_prog("examples/mut2.rs"); +fn let2_test() { + eval_prog("examples/let2.rs"); } #[test]