another missing return value fix
[fw/sdcc] / src / SDCCopt.c
index d9183695512c6b1eb5ffa5e856800ffff9db9fca..25ca302e7583af2e80a0b09587b9cba3fa6578c7 100644 (file)
@@ -889,6 +889,23 @@ eBBlockFromiCode (iCode * ic)
   /* sort it back by block number */
   qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare);
 
+  if (!options.lessPedantic) {
+    // this is a good place to check missing return values
+    if (currFunc) {
+      if (!IS_VOID(currFunc->etype)) {
+       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 (W_VOID_FUNC, currFunc->name);
+         }
+       }
+      }
+    }
+  }
+
   /* if cyclomatic info requested then print it */
   if (options.cyclomatic)
     printCyclomatic (ebbs, saveCount);
@@ -916,6 +933,8 @@ eBBlockFromiCode (iCode * ic)
   /* throw away blocks */
   setToNull ((void **) &graphEdges);
   ebbs = NULL;
+  
+  currFunc=NULL;
 
   return NULL;
 }