Add warning for missing return statement

This commit is contained in:
drmortalwombat 2022-10-16 14:06:27 +02:00
parent 4ff762b711
commit e52e554fec
5 changed files with 36 additions and 3 deletions

View File

@ -25,6 +25,7 @@ enum ErrorID
EWARN_OPTIMIZER_LOCKED,
EWARN_LOOP_UNROLL_IGNORED,
EWARN_USE_OF_UNINITIALIZED_VARIABLE,
EWARN_MISSING_RETURN_STATEMENT,
EERR_GENERIC = 3000,
EERR_FILE_NOT_FOUND,

View File

@ -12104,6 +12104,27 @@ void InterCodeBasicBlock::PeepholeOptimization(const GrowingVariableArray& stati
}
}
void InterCodeBasicBlock::CheckValueReturn(InterCodeProcedure* proc)
{
if (!mVisited)
{
mVisited = true;
for (int i = 0; i < mInstructions.Size(); i++)
{
InterInstruction* ins = mInstructions[i];
if (ins->mCode == IC_ASSEMBLER)
return;
else if (ins->mCode == IC_RETURN)
proc->mModule->mErrors->Error(ins->mLocation, EWARN_MISSING_RETURN_STATEMENT, "Missing return statement");
}
if (mTrueJump) mTrueJump->CheckValueReturn(proc);
if (mFalseJump) mFalseJump->CheckValueReturn(proc);
}
}
void InterCodeBasicBlock::WarnUsedUndefinedVariables(InterCodeProcedure* proc)
{
if (!mVisited)
@ -12438,7 +12459,7 @@ InterCodeProcedure::InterCodeProcedure(InterCodeModule * mod, const Location & l
mIdent(ident), mLinkerObject(linkerObject),
mNativeProcedure(false), mLeafProcedure(false), mCallsFunctionPointer(false), mCalledFunctions(nullptr), mFastCallProcedure(false),
mInterrupt(false), mHardwareInterrupt(false), mCompiled(false), mInterruptCalled(false),
mSaveTempsLinkerObject(nullptr)
mSaveTempsLinkerObject(nullptr), mValueReturn(false)
{
mID = mModule->mProcedures.Size();
mModule->mProcedures.Push(this);
@ -13807,6 +13828,12 @@ void InterCodeProcedure::Close(void)
MapCallerSavedTemps();
if (mValueReturn)
{
ResetVisited();
mEntryBlock->CheckValueReturn(this);
}
if (mSaveTempsLinkerObject && mTempSize > 16)
mSaveTempsLinkerObject->AddSpace(mTempSize - 16);
}

View File

@ -508,6 +508,8 @@ public:
bool SameExitCode(const InterCodeBasicBlock* block) const;
void WarnUsedUndefinedVariables(InterCodeProcedure* proc);
void CheckValueReturn(InterCodeProcedure* proc);
};
class InterCodeModule;
@ -529,7 +531,7 @@ public:
GrowingIntArray mTempOffset, mTempSizes;
int mTempSize, mCommonFrameSize, mCallerSavedTemps, mFreeCallerSavedTemps;
bool mLeafProcedure, mNativeProcedure, mCallsFunctionPointer, mHasDynamicStack, mHasInlineAssembler, mCallsByteCode, mFastCallProcedure;
bool mInterrupt, mHardwareInterrupt, mCompiled, mInterruptCalled;
bool mInterrupt, mHardwareInterrupt, mCompiled, mInterruptCalled, mValueReturn;
GrowingInterCodeProcedurePtrArray mCalledFunctions;
InterCodeModule * mModule;

View File

@ -3550,6 +3550,9 @@ InterCodeProcedure* InterCodeGenerator::TranslateProcedure(InterCodeModule * mod
dec->mLinkerObject->mTempSizes[0] = BC_REG_FPARAMS_END - BC_REG_FPARAMS;
}
if (dec->mBase->mBase->mType != DT_TYPE_VOID)
proc->mValueReturn = true;
InterCodeBasicBlock* entryBlock = new InterCodeBasicBlock();
proc->Append(entryBlock);

View File

@ -152,7 +152,7 @@ bool snake_advance(Snake * s)
}
// flash the snake after collision
bool snake_flash(Snake * s, char c)
void snake_flash(Snake * s, char c)
{
// Loop over all tail elements
for(char i=0; i<s->length; i++)