From 598be4cd1bdd79e4859ae30291f4d65682cc672a Mon Sep 17 00:00:00 2001
From: Kimplul <kimi.h.kuparinen@gmail.com>
Date: Thu, 9 Jan 2025 22:26:02 +0200
Subject: initial reference checking

---
 src/parser.y | 38 +++++++++++++++++++++++++++++++++++---
 1 file changed, 35 insertions(+), 3 deletions(-)

(limited to 'src/parser.y')

diff --git a/src/parser.y b/src/parser.y
index dd177d0..751aaa1 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -227,9 +227,31 @@ type
 	| APPLY "[" opt_types "]" {
 		$$ = tgen_construct($[APPLY], $[opt_types], src_loc(@$));
 	}
-	| "(" opt_types ")" { $$ = tgen_callable($2, src_loc(@$)); }
-	| "&" type { $$ = tgen_ref($2, src_loc(@$)); }
-	| "*" type { $$ = tgen_ptr($2, src_loc(@$)); }
+	| "(" opt_types ")" { $$ = tgen_closure($2, src_loc(@$)); }
+	| "&&" type {
+		if ($2->k == TYPE_CLOSURE) {
+			$$ = $2; $$->k = TYPE_PURE_CLOSURE;
+		} else {
+			$$ = tgen_ref($2, src_loc(@$));
+		}
+
+		/* heh */
+		$$ = tgen_ref($$, src_loc(@$));
+	}
+	| "&" type {
+		if ($2->k == TYPE_CLOSURE) {
+			$$ = $2; $$->k = TYPE_PURE_CLOSURE;
+		} else {
+			$$ = tgen_ref($2, src_loc(@$));
+		}
+	}
+	| "*" type {
+		if ($2->k == TYPE_CLOSURE) {
+			$$ = $2; $$->k = TYPE_FUNC_PTR;
+		} else {
+			$$ = tgen_ptr($2, src_loc(@$));
+		}
+	}
 
 rev_types
 	: rev_types "," type { $$ = $3; $$->n = $1; }
@@ -259,6 +281,8 @@ expr
 	| INT { $$ = gen_const_int($1, src_loc(@$)); }
 	| ID { $$ = gen_id($1, src_loc(@$)); }
 	| "(" expr ")" { $$ = $2; }
+	| expr "&" { $$ = gen_ref($1, src_loc(@$)); }
+	| expr "*" { $$ = gen_deref($1, src_loc(@$)); }
 	| construct
 	| binop
 	| unop
@@ -276,6 +300,10 @@ opt_exprs
 
 closure
 	: "=>" opt_vars body { $$ = gen_closure($[opt_vars], $[body], src_loc(@$)); }
+	| "&" "=>" opt_vars body {
+		$$ = gen_closure($[opt_vars], $[body], src_loc(@$));
+		ast_set_flags($$, AST_FLAG_NOMOVES);
+	}
 
 rev_closures
 	: rev_closures closure { $$ = $2; $2->n = $1; }
@@ -283,6 +311,10 @@ rev_closures
 
 trailing_closure
 	: "=>" opt_vars ";" { $$ = gen_closure($[opt_vars], NULL, src_loc(@$));}
+	| "&" "=>" opt_vars ";" {
+		$$ = gen_closure($[opt_vars], NULL, src_loc(@$));
+		ast_set_flags($$, AST_FLAG_NOMOVES);
+	}
 
 opt_trailing_closure
 	: trailing_closure
-- 
cgit v1.2.3