From 0399f9b7d8382bceb9c8169ee3a1ed1d2fe34dcb Mon Sep 17 00:00:00 2001
From: Per Lindgren <per.lindgren@ltu.se>
Date: Wed, 21 Oct 2020 16:12:17 +0200
Subject: [PATCH] initial commit wip2

---
 examples/stacked_borrows.rs | 40 ++++++++++++++++++++++++++++++-------
 1 file changed, 33 insertions(+), 7 deletions(-)

diff --git a/examples/stacked_borrows.rs b/examples/stacked_borrows.rs
index e87e08e..f938cec 100644
--- a/examples/stacked_borrows.rs
+++ b/examples/stacked_borrows.rs
@@ -57,18 +57,43 @@ enum Stmt {
     Assign(Expr, Expr),
 }
 
-fn left_expr(e: &Expr) -> &Id {
+fn left_expr(e: &Expr) -> Id {
     match e {
-        Expr::Id(id) => id,
+        Expr::Id(id) => id.to_owned(),
         Expr::Deref(e) => left_expr(e),
         _ => unimplemented!("illegal left hand"),
     }
 }
 
+fn right_expr(e: &Expr) -> &Expr {
+    println!("right_expr {:?}", e);
+    match e {
+        Expr::Id(_) => e,
+        Expr::Lit => e,
+        Expr::Ref(_) => {
+            println!("Ref");
+            e
+        }
+        Expr::RefMut(_) => {
+            println!("RefMut");
+            e
+        }
+        Expr::Deref(e) => {
+            println!("Deref");
+            right_expr(e)
+        }
+    }
+}
+
 fn check_stmt(s: &Stmt, store: &mut Store) {
     match s {
         Stmt::Let(id, e) => store.alloc(id.to_owned()),
-        Stmt::Assign(le, re) => {}
+        Stmt::Assign(le, re) => {
+            println!("assign le :{:?}, re: {:?}", le, re);
+            let id = left_expr(le);
+            let e = right_expr(re);
+            println!("assign id :{:?}, re: {:?}", id, e);
+        }
     }
 }
 
@@ -83,10 +108,11 @@ fn main() {
     use {Expr::*, Stmt::*};
 
     let v = vec![
-        Let(id("a"), Lit),                        // let a = ...;
-        Let(id("b"), Lit),                        // let b = ...;
-        Let(id("c"), Ref(Box::new(Id(id("a"))))), // let c = &a;
-        Assign(Id(id("a")), Lit),                 // a = ...;
+        Let(id("a"), Lit),                         // let a = ...;
+        Let(id("b"), Lit),                         // let b = ...;
+        Let(id("c"), Ref(Box::new(Id(id("a"))))),  // let c = &a;
+        Assign(Id(id("a")), Lit),                  // a = ...;
+        Assign(Deref(Box::new(Id(id("c")))), Lit), // *c = ..;
     ];
 
     println!("prog {:?}", v);
-- 
GitLab