diff options
Diffstat (limited to 'src/cmd/gc/walk.c')
-rw-r--r-- | src/cmd/gc/walk.c | 17 |
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 */ |