From 550fec282733c7ceac6e30f97fa5b4e6b0d297f0 Mon Sep 17 00:00:00 2001 From: sofia Date: Sun, 20 Jul 2025 22:33:00 +0300 Subject: [PATCH] Fix typeinference and checking for borrows/derefs --- reid/src/mir/impl.rs | 6 +++--- reid/src/mir/linker.rs | 8 ++++---- reid/src/mir/typecheck.rs | 2 ++ reid/src/mir/typeinference.rs | 12 ++++++++++-- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/reid/src/mir/impl.rs b/reid/src/mir/impl.rs index 3c401e8..5864e82 100644 --- a/reid/src/mir/impl.rs +++ b/reid/src/mir/impl.rs @@ -230,9 +230,9 @@ impl Expression { Ok((ret_type.0, TypeKind::Borrow(Box::new(ret_type.1)))) } Deref(var) => { - let ret_type = var.return_type()?; - match ret_type { - (_, TypeKind::Borrow(type_kind)) => Ok((ret_type.0, *type_kind)), + let (kind, ret_type) = var.return_type()?; + match ret_type.resolve_weak(refs) { + TypeKind::Borrow(type_kind) => Ok((kind, *type_kind)), _ => Err(ReturnTypeOther::DerefNonBorrow(var.2)), } } diff --git a/reid/src/mir/linker.rs b/reid/src/mir/linker.rs index e8b66af..530faca 100644 --- a/reid/src/mir/linker.rs +++ b/reid/src/mir/linker.rs @@ -103,10 +103,10 @@ impl<'map> Pass for LinkerPass<'map> { modules.insert(module.name.clone(), Rc::new(RefCell::new((module, tokens)))); } - modules.insert( - "std".to_owned(), - Rc::new(RefCell::new(compile_std(&mut self.module_map)?)), - ); + // modules.insert( + // "std".to_owned(), + // Rc::new(RefCell::new(compile_std(&mut self.module_map)?)), + // ); let mut modules_to_process: Vec)>>> = modules.values().cloned().collect(); diff --git a/reid/src/mir/typecheck.rs b/reid/src/mir/typecheck.rs index 7d24570..b407b2e 100644 --- a/reid/src/mir/typecheck.rs +++ b/reid/src/mir/typecheck.rs @@ -677,6 +677,8 @@ impl Expression { return Err(ErrorKind::AttemptedDerefNonBorrow(var_ref.1.clone())); }; + var_ref.0 = TypeKind::Borrow(inner.clone()); + Ok(*inner) } } diff --git a/reid/src/mir/typeinference.rs b/reid/src/mir/typeinference.rs index 5e02dc0..f524679 100644 --- a/reid/src/mir/typeinference.rs +++ b/reid/src/mir/typeinference.rs @@ -144,6 +144,8 @@ impl Block { let mut ret_type_ref = outer_refs.from_type(&ty).unwrap(); // Narow return type to declared type if hard return + dbg!(&kind, ty); + if kind == ReturnKind::Hard { if let Some(hint) = &state.scope.return_type_hint { ret_type_ref.narrow(&mut outer_refs.from_type(&hint).unwrap()); @@ -392,10 +394,16 @@ impl Expression { var.0 = hint.as_type(); } - match &var.0.resolve_weak(type_refs.types) { + dbg!(&var.0); + dbg!(&var.0.resolve_weak(type_refs.types)); + let a = match &var.0.resolve_weak(type_refs.types) { Borrow(type_kind) => Ok(type_refs.from_type(&type_kind).unwrap()), _ => Err(ErrorKind::AttemptedDerefNonBorrow(var.1.clone())), - } + }; + + dbg!(&a); + + a } } }