From 767f261299d6f0c7d7f7c966ec57bd9ee88251d1 Mon Sep 17 00:00:00 2001
From: Per Lindgren <per.lindgren@ltu.se>
Date: Thu, 17 Sep 2020 18:47:40 +0200
Subject: [PATCH] handling of unknown reference

---
 src/check.rs | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/check.rs b/src/check.rs
index 42d2522..46c2d2a 100644
--- a/src/check.rs
+++ b/src/check.rs
@@ -194,6 +194,16 @@ fn strip_mut(t: Type) -> Type {
     }
 }
 
+fn is_known(t: &Type) -> bool {
+    use Type::*;
+    match t {
+        Type::Unknown => false,
+        Unit | Bool | I32 => true,
+        Mut(t) | Ref(t) => is_known(t),
+        _ => panic!("ICE is_known"),
+    }
+}
+
 pub fn check_stmts(
     stmts: &Stmts,
     fn_env: &FnEnv,
@@ -223,7 +233,13 @@ pub fn check_stmts(
                             }
                         }
                     }
-                    (None, Some(e)) => expr_type(&*e, fn_env, type_env, var_env)?,
+                    (None, Some(e)) => {
+                        let et = expr_type(&*e, fn_env, type_env, var_env)?;
+                        match is_known(&et) {
+                            true => et,
+                            _ => Err("reference to unknown type".to_string())?,
+                        }
+                    }
                     (Some(t), None) => t.clone(),
                     _ => Type::Unknown,
                 };
-- 
GitLab