diff --git a/compile.c b/compile.c
index 03d03c3e..cc5a8d09 100644
--- a/compile.c
+++ b/compile.c
@@ -399,7 +399,7 @@ block block_drop_unreferenced(block body) {
   int drop;
   do {
     drop = 0;
-    while((curr = block_take(&body)) && curr->op != TOP) {
+    while ((curr = block_take(&body)) && curr->op != TOP) {
       block b = inst_block(curr);
       if (block_count_refs(b,refd) + block_count_refs(b,body) == 0) {
         unrefd = BLOCK(unrefd, b);
@@ -593,7 +593,11 @@ block gen_definedor(block a, block b) {
 }
 
 int block_has_main(block top) {
-  return top.first && top.first->op == TOP;
+  for (inst *c = top.first; c; c = c->next) {
+    if (c->op == TOP)
+      return 1;
+  }
+  return 0;
 }
 
 int block_is_funcdef(block b) {
diff --git a/parser.y b/parser.y
index 0117e1a2..72e2b28f 100644
--- a/parser.y
+++ b/parser.y
@@ -278,10 +278,7 @@ FuncDef FuncDefs {
 
 Exp:
 FuncDef Exp %prec ';' {
-  if (block_is_funcdef($2))
-    $$ = block_bind($1, $2, OP_IS_CALL_PSEUDO);
-  else
-    $$ = block_bind($1, BLOCK(gen_op_simple(TOP), $2), OP_IS_CALL_PSEUDO);
+  $$ = block_bind_referenced($1, $2, OP_IS_CALL_PSEUDO);
 } |
 
 Term "as" '$' IDENT '|' Exp {