detect missing return values
authorjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 2 Apr 2003 14:14:20 +0000 (14:14 +0000)
committerjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 2 Apr 2003 14:14:20 +0000 (14:14 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2463 4a8a32a2-be11-0410-ad9d-d568d2c75423

src/SDCCopt.c

index d9183695512c6b1eb5ffa5e856800ffff9db9fca..1d390a69cc9cbcb135c44eacbdf7a978442ff255 100644 (file)
@@ -886,6 +886,21 @@ eBBlockFromiCode (iCode * ic)
 
     }
 
+  // this is a good place to check missing return values
+  if (currFunc) {
+    if (!IS_VOID(currFunc->type->next)) {
+      eBBlock *bp;
+      // make sure all predecessors of the last block end in a return
+      for (bp=setFirstItem(ebbs[saveCount-1]->predList); 
+          bp; 
+          bp=setNextItem(ebbs[saveCount-1]->predList)) {
+       if (bp->ech->op != RETURN) {
+         werror (E_VOID_FUNC, currFunc->name);
+       }
+      }
+    }
+  }
+
   /* sort it back by block number */
   qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare);
 
@@ -916,6 +931,8 @@ eBBlockFromiCode (iCode * ic)
   /* throw away blocks */
   setToNull ((void **) &graphEdges);
   ebbs = NULL;
+  
+  currFunc=NULL;
 
   return NULL;
 }