From 85dda90bf45c16956e917c45c525ad1a67727753 Mon Sep 17 00:00:00 2001
From: Leo Tenenbaum <pommicket@gmail.com>
Date: Wed, 18 Mar 2020 18:22:14 -0400
Subject: cant return a #C, improved defer test

---
 main.c               |  1 -
 test.toc             | 12 ++++++++++++
 tests/defer.toc      | 12 ++++++++++++
 tests/defer_expected |  2 ++
 types.c              |  8 ++++++++
 5 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/main.c b/main.c
index b24c794..3134bca 100644
--- a/main.c
+++ b/main.c
@@ -8,7 +8,6 @@
 
 /* 
 TODO:
-make sure you can't return a #C() (because of the current defer system)
 switch to:
 	static void 
 	foo() {
diff --git a/test.toc b/test.toc
index 28e639e..1ecc9ce 100644
--- a/test.toc
+++ b/test.toc
@@ -1,6 +1,18 @@
 #include "std/io.toc", io;
 
+plusone ::= fn(n : int) x := n {
+	defer x += 1;
+}
+
+same ::= fn(n : int) int {
+	x := n;
+	defer x += 1;
+	x
+}
+
 main ::= fn() {
+	io.puti(plusone(3));
+	io.puti(same(3));
 	defer io.puts("deferred from main()");
 	for i := 1..10 {
 		defer io.puts("deferred from for");
diff --git a/tests/defer.toc b/tests/defer.toc
index 77a4c4e..32165e7 100644
--- a/tests/defer.toc
+++ b/tests/defer.toc
@@ -1,6 +1,18 @@
 #include "io.toc", io;
 
+plusone ::= fn(n : int) x := n {
+	defer x += 1;
+}
+
+same ::= fn(n : int) int {
+	x := n;
+	defer x += 1;
+	x
+}
+
 main ::= fn() {
+	io.puti(plusone(3));
+	io.puti(same(3));
 	defer io.puts("deferred from main()");
 	for i := 1..10 {
 		defer io.puts("deferred from for");
diff --git a/tests/defer_expected b/tests/defer_expected
index 0a6daa7..99b45e1 100644
--- a/tests/defer_expected
+++ b/tests/defer_expected
@@ -1,3 +1,5 @@
+4
+3
 1
 deferred from for
 2
diff --git a/types.c b/types.c
index f2b7db1..8f64879 100644
--- a/types.c
+++ b/types.c
@@ -1074,6 +1074,14 @@ static Status types_fn(Typer *tr, FnExpr *f, Type *t, Instance *instance) {
 			success = false;
 			goto ret;
 		}
+		if (ret_expr->type.kind == TYPE_UNKNOWN) { 
+			/* maybe it's just unknown because something messed up (like typing another function), 
+			   and ??? is a placeholder */
+			if (!tr->err_ctx->have_errored) {
+				err_print(ret_expr->where, "Can't determine type of return value. Try assigning it to a variable before returning it.");
+				return false;
+			}
+		}
 	} else if (ret_type->kind != TYPE_VOID && !has_named_ret_vals) {
 		Statement *stmts = f->body.stmts;
 		if (arr_len(stmts)) {
-- 
cgit v1.2.3