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