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