diff --git a/examples/borrow.rs b/examples/borrow.rs index 3999f25758aa0e21c3fcd9a61f4b30d1729fe6ac..7e40ef0b4b7602100030e39753b6e14c2f36b25a 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 0000000000000000000000000000000000000000..3adba68694e927e9b7ce5d5eb714cf065673ccf3 --- /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 9a0fac4274d84e961058562b5c1673e79faf52e2..97c8248f8d98a0f9b2306fee53442682fee15048 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 2c5e71d0525b83df22eb024929b10933c193143a..484e5c8ef3aaba922a25438f891aca34fc9cddba 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(); +}