Przeglądaj źródła

better protection against missing returns

Kajetan Johannes Hammerle 3 lat temu
rodzic
commit
b1b20097d2
2 zmienionych plików z 13 dodań i 7 usunięć
  1. 6 6
      Compiler.c
  2. 7 1
      tests/mix

+ 6 - 6
Compiler.c

@@ -35,7 +35,7 @@ static Structs structs;
 
 static int returns[RETURN_BUFFER];
 static int returnIndex = 0;
-static bool hasReturn = false;
+static int hasReturn = 0;
 static DataType returnType;
 
 static int breaks[BREAK_BUFFER];
@@ -148,6 +148,7 @@ static void cAddInt16(int16 i) {
 }
 
 static Token cReadTokenAndLine() {
+    hasReturn--;
     Token t = tReadToken();
     if(tReadInt16(&line)) {
         return t;
@@ -724,10 +725,10 @@ static void cReturn() {
     if(returnIndex >= RETURN_BUFFER) {
         cError("too much returns in function");
     }
-    hasReturn = true;
     if(dtCompare(returnType, dtVoid())) {
         cConsumeToken(T_SEMICOLON);
         cAddReturn(OP_RETURN);
+        hasReturn = 2;
         return;
     }
     DataType dt = cUnpackedExpression();
@@ -744,6 +745,7 @@ static void cReturn() {
         cError("cannot return %s", cGetName(dt));
     }
     cConsumeToken(T_SEMICOLON);
+    hasReturn = 2;
 }
 
 static void cPrint() {
@@ -846,7 +848,7 @@ static void cSetVariable() {
         return;
     }
     if(!dtRemoveVariable(&dt)) {
-        cError("reference or void expected: %s", cGetName(dt));
+        cError("return value not used: %s", cGetName(dt));
     }
     Token t = cReadTokenAndLine();
     switch(t) {
@@ -946,7 +948,6 @@ static void cContinue() {
 static void cLine() {
     int marker = tGetMarker();
     Token t = cReadTokenAndLine();
-    hasReturn = false;
     cAddOperation(OP_LINE);
     cAddInt16(line);
     switch(t) {
@@ -1039,9 +1040,8 @@ static void cInnerFunction(Function* f) {
     cConsumeToken(T_OPEN_CURVED_BRACKET);
     int p = cReserve(f->size);
     returnIndex = 0;
-    hasReturn = false;
     cConsumeScope();
-    if(!dtCompare(returnType, dtVoid()) && !hasReturn) {
+    if(!dtCompare(returnType, dtVoid()) && hasReturn <= 0) {
         cError("missing return");
     }
     cFree(p, vars.maxAddress);

+ 7 - 1
tests/mix

@@ -1,4 +1,8 @@
-void test() {
+int test() {
+    if(false) {
+        return 5;
+    }
+    return 4;
 }
 
 void main() {
@@ -15,4 +19,6 @@ void main() {
     print (&a)[0];
     print *&*&a;
     a = *&a;
+    
+    a = test();
 }