Add warning for missing return statement
This commit is contained in:
parent
4ff762b711
commit
e52e554fec
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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++)
|
||||
|
|
Loading…
Reference in New Issue