From d3e09690fd0db12bc9155ab4907fe0a35e3e3bc5 Mon Sep 17 00:00:00 2001
From: Per Lindgren <per.lindgren@ltu.se>
Date: Thu, 24 Sep 2020 20:32:23 +0200
Subject: [PATCH] borrow check, wip3

---
 examples/borrow.rs  |  6 +++---
 examples/borrow2.rs |  5 +++++
 src/check.rs        | 13 +++++++------
 tests/test_check.rs |  5 +++++
 4 files changed, 20 insertions(+), 9 deletions(-)
 create mode 100644 examples/borrow2.rs

diff --git a/examples/borrow.rs b/examples/borrow.rs
index 3999f25..7e40ef0 100644
--- a/examples/borrow.rs
+++ b/examples/borrow.rs
@@ -1,6 +1,6 @@
+fn f(a: &i32, b: &mut bool) {}
 fn main() {
     let mut a = 1;
-    let b = &mut a;
-    let c = &mut a;
-    let c: &mut i32 = b;
+    let mut b = false;
+    f(&a, &mut b)
 }
diff --git a/examples/borrow2.rs b/examples/borrow2.rs
new file mode 100644
index 0000000..3adba68
--- /dev/null
+++ b/examples/borrow2.rs
@@ -0,0 +1,5 @@
+fn f(a: &i32, b: &mut i32) {}
+fn main() {
+    let mut a = 1;
+    f(&a, &mut a)
+}
diff --git a/src/check.rs b/src/check.rs
index 9a0fac4..97c8248 100644
--- a/src/check.rs
+++ b/src/check.rs
@@ -160,12 +160,12 @@ fn expr_type(
         // Convert Expr::Ref to Type::Ref
         Ref(ref_e) => {
             let t = expr_type(ref_e, fn_env, type_env, var_env)?;
-            trace!("ref_e {}, t {}", ref_e, t);
-            let t = match t {
-                Type::Mut(t) => t.clone(),
-                t => Box::new(t),
-            };
-            Ok(Type::Ref(t))
+            trace!("ref_e {}: type {}", ref_e, t);
+
+            let t = strip_mut(t);
+            trace!("after ref_e {}: type {}", ref_e, t);
+
+            Ok(Type::Ref(Box::new(t)))
         }
 
         // Convert Expr::Mut to Type::Mut
@@ -373,6 +373,7 @@ pub fn check_stmts(
     type_env: &TypeEnv,
     var_env: &mut VarEnv,
 ) -> Result<Type, Error> {
+    trace!("check_stmts: var_env: {:?}", var_env);
     var_env.push_empty_scope();
 
     let t = stmts
diff --git a/tests/test_check.rs b/tests/test_check.rs
index 2c5e71d..484e5c8 100644
--- a/tests/test_check.rs
+++ b/tests/test_check.rs
@@ -175,3 +175,8 @@ fn wip() {
 fn borrow() {
     check(&read_file::parse("examples/borrow.rs")).unwrap();
 }
+
+#[test]
+fn borrow2() {
+    check(&read_file::parse("examples/borrow2.rs")).unwrap();
+}
-- 
GitLab