summaryrefslogtreecommitdiff
path: root/src/cmd/gc/walk.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/gc/walk.c')
-rw-r--r--src/cmd/gc/walk.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/cmd/gc/walk.c b/src/cmd/gc/walk.c
index 0110fe407..f8c10c3ec 100644
--- a/src/cmd/gc/walk.c
+++ b/src/cmd/gc/walk.c
@@ -112,7 +112,7 @@ loop:
if(top != Etop)
goto nottop;
walktype(n->ninit, Etop);
- walktype(n->ntest, Erv);
+ walkbool(n->ntest);
walktype(n->nincr, Etop);
n = n->nbody;
goto loop;
@@ -151,7 +151,7 @@ loop:
if(top != Etop)
goto nottop;
walktype(n->ninit, Etop);
- walktype(n->ntest, Erv);
+ walkbool(n->ntest);
walktype(n->nelse, Etop);
n = n->nbody;
goto loop;
@@ -377,6 +377,10 @@ loop:
if(top != Etop)
goto nottop;
walktype(n->left, Erv);
+ if(curfn->type->outnamed && n->left == N) {
+ // print("special return\n");
+ goto ret;
+ }
l = ascompatte(n->op, getoutarg(curfn->type), &n->left, 1);
if(l != N)
n->left = reorder4(l);
@@ -722,6 +726,15 @@ ret:
lineno = lno;
}
+void
+walkbool(Node *n)
+{
+ walktype(n, Erv);
+ if(n != N && n->type != T)
+ if(!eqtype(n->type, types[TBOOL], 0))
+ yyerror("IF and FOR require a boolean type");
+}
+
/*
* return the first type
*/