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]