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_OPTIMIZER_LOCKED,
|
||||||
EWARN_LOOP_UNROLL_IGNORED,
|
EWARN_LOOP_UNROLL_IGNORED,
|
||||||
EWARN_USE_OF_UNINITIALIZED_VARIABLE,
|
EWARN_USE_OF_UNINITIALIZED_VARIABLE,
|
||||||
|
EWARN_MISSING_RETURN_STATEMENT,
|
||||||
|
|
||||||
EERR_GENERIC = 3000,
|
EERR_GENERIC = 3000,
|
||||||
EERR_FILE_NOT_FOUND,
|
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)
|
void InterCodeBasicBlock::WarnUsedUndefinedVariables(InterCodeProcedure* proc)
|
||||||
{
|
{
|
||||||
if (!mVisited)
|
if (!mVisited)
|
||||||
|
@ -12438,7 +12459,7 @@ InterCodeProcedure::InterCodeProcedure(InterCodeModule * mod, const Location & l
|
||||||
mIdent(ident), mLinkerObject(linkerObject),
|
mIdent(ident), mLinkerObject(linkerObject),
|
||||||
mNativeProcedure(false), mLeafProcedure(false), mCallsFunctionPointer(false), mCalledFunctions(nullptr), mFastCallProcedure(false),
|
mNativeProcedure(false), mLeafProcedure(false), mCallsFunctionPointer(false), mCalledFunctions(nullptr), mFastCallProcedure(false),
|
||||||
mInterrupt(false), mHardwareInterrupt(false), mCompiled(false), mInterruptCalled(false),
|
mInterrupt(false), mHardwareInterrupt(false), mCompiled(false), mInterruptCalled(false),
|
||||||
mSaveTempsLinkerObject(nullptr)
|
mSaveTempsLinkerObject(nullptr), mValueReturn(false)
|
||||||
{
|
{
|
||||||
mID = mModule->mProcedures.Size();
|
mID = mModule->mProcedures.Size();
|
||||||
mModule->mProcedures.Push(this);
|
mModule->mProcedures.Push(this);
|
||||||
|
@ -13807,6 +13828,12 @@ void InterCodeProcedure::Close(void)
|
||||||
|
|
||||||
MapCallerSavedTemps();
|
MapCallerSavedTemps();
|
||||||
|
|
||||||
|
if (mValueReturn)
|
||||||
|
{
|
||||||
|
ResetVisited();
|
||||||
|
mEntryBlock->CheckValueReturn(this);
|
||||||
|
}
|
||||||
|
|
||||||
if (mSaveTempsLinkerObject && mTempSize > 16)
|
if (mSaveTempsLinkerObject && mTempSize > 16)
|
||||||
mSaveTempsLinkerObject->AddSpace(mTempSize - 16);
|
mSaveTempsLinkerObject->AddSpace(mTempSize - 16);
|
||||||
}
|
}
|
||||||
|
|
|
@ -508,6 +508,8 @@ public:
|
||||||
bool SameExitCode(const InterCodeBasicBlock* block) const;
|
bool SameExitCode(const InterCodeBasicBlock* block) const;
|
||||||
|
|
||||||
void WarnUsedUndefinedVariables(InterCodeProcedure* proc);
|
void WarnUsedUndefinedVariables(InterCodeProcedure* proc);
|
||||||
|
void CheckValueReturn(InterCodeProcedure* proc);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class InterCodeModule;
|
class InterCodeModule;
|
||||||
|
@ -529,7 +531,7 @@ public:
|
||||||
GrowingIntArray mTempOffset, mTempSizes;
|
GrowingIntArray mTempOffset, mTempSizes;
|
||||||
int mTempSize, mCommonFrameSize, mCallerSavedTemps, mFreeCallerSavedTemps;
|
int mTempSize, mCommonFrameSize, mCallerSavedTemps, mFreeCallerSavedTemps;
|
||||||
bool mLeafProcedure, mNativeProcedure, mCallsFunctionPointer, mHasDynamicStack, mHasInlineAssembler, mCallsByteCode, mFastCallProcedure;
|
bool mLeafProcedure, mNativeProcedure, mCallsFunctionPointer, mHasDynamicStack, mHasInlineAssembler, mCallsByteCode, mFastCallProcedure;
|
||||||
bool mInterrupt, mHardwareInterrupt, mCompiled, mInterruptCalled;
|
bool mInterrupt, mHardwareInterrupt, mCompiled, mInterruptCalled, mValueReturn;
|
||||||
GrowingInterCodeProcedurePtrArray mCalledFunctions;
|
GrowingInterCodeProcedurePtrArray mCalledFunctions;
|
||||||
|
|
||||||
InterCodeModule * mModule;
|
InterCodeModule * mModule;
|
||||||
|
|
|
@ -3550,6 +3550,9 @@ InterCodeProcedure* InterCodeGenerator::TranslateProcedure(InterCodeModule * mod
|
||||||
dec->mLinkerObject->mTempSizes[0] = BC_REG_FPARAMS_END - BC_REG_FPARAMS;
|
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();
|
InterCodeBasicBlock* entryBlock = new InterCodeBasicBlock();
|
||||||
|
|
||||||
proc->Append(entryBlock);
|
proc->Append(entryBlock);
|
||||||
|
|
|
@ -152,7 +152,7 @@ bool snake_advance(Snake * s)
|
||||||
}
|
}
|
||||||
|
|
||||||
// flash the snake after collision
|
// flash the snake after collision
|
||||||
bool snake_flash(Snake * s, char c)
|
void snake_flash(Snake * s, char c)
|
||||||
{
|
{
|
||||||
// Loop over all tail elements
|
// Loop over all tail elements
|
||||||
for(char i=0; i<s->length; i++)
|
for(char i=0; i<s->length; i++)
|
||||||
|
|
Loading…
Reference in New Issue