about summary refs log tree commit diff
path: root/src/interpret/walker.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/interpret/walker.rs')
-rw-r--r--src/interpret/walker.rs9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/interpret/walker.rs b/src/interpret/walker.rs
index 3feed6f..15ab37d 100644
--- a/src/interpret/walker.rs
+++ b/src/interpret/walker.rs
@@ -51,7 +51,11 @@ impl Walker {
                 println!("{}", result);
                 None
             }
-            Statement::Return(node) => Some(self.walk_expression(node)?),
+            // FIXME: Returns are always expected to have a return even though `return;` is valid.
+            Statement::Return(node) => {
+                // If there's a function running above us it will catch this error.
+                return Err(WalkerError::Return(self.walk_expression(node)?));
+            }
             Statement::Break(node) => {
                 let returned = if let Some(expression) = node {
                     Some(self.walk_expression(expression)?)
@@ -307,4 +311,7 @@ pub enum WalkerError {
     LoopContinue,
     #[error("Break statements are only valid inside loops.")]
     LoopBreak(Option<Value>),
+    // Same as with the loop control errors, but for functions.
+    #[error("Return statements are only valid inside functions.")]
+    Return(Value),
 }