From 79f8e81b7b4d89231fcff207ff2c13e4c24cde56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Wed, 17 Feb 2021 22:53:51 +0100 Subject: find and fix error in typesystem --- src/vm.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/vm.rs b/src/vm.rs index 8208551..791bebe 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -630,6 +630,16 @@ impl VM { } } + Op::AssignLocal(slot) => { + let slot = self.frame().stack_offset + slot; + let curr = Type::from(&self.stack[slot]); + let other = Type::from(self.pop()); + if curr != other { + error!(self, ErrorKind::TypeMismatch(curr, other), + "Cannot assign to different type."); + } + } + Op::Return => { let a = self.pop(); let inner = self.frame().block.borrow(); @@ -819,6 +829,9 @@ mod tests { }", [ErrorKind::ValueError(Op::Call(0), _)]); + test_string!(invalid_assign, "a := 1\na = 0.1\n", + [ErrorKind::TypeMismatch(Type::Int, Type::Float)]); + test_string!(wrong_params, " f : fn -> int = fn a: int -> int {}", [ErrorKind::TypeMismatch(_, _), ErrorKind::TypeMismatch(Type::Void, Type::Int)]); -- cgit v1.2.1