Avoid inline of functions with missing return statement

This commit is contained in:
drmortalwombat 2024-09-19 18:02:01 +02:00
parent 6981b28a64
commit 9adcbd2706
3 changed files with 19 additions and 1 deletions

View File

@ -124,6 +124,7 @@ static const uint64 DTF_FUNC_THIS = (1ULL << 47);
static const uint64 DTF_VAR_ALIASING = (1ULL << 48); static const uint64 DTF_VAR_ALIASING = (1ULL << 48);
static const uint64 DTF_FPARAM_UNUSED = (1ULL << 49); static const uint64 DTF_FPARAM_UNUSED = (1ULL << 49);
static const uint64 DTF_DEPRECATED = (1ULL << 50); static const uint64 DTF_DEPRECATED = (1ULL << 50);
static const uint64 DTF_FUNC_NO_RETURN = (1ULL << 51);
class Declaration; class Declaration;

View File

@ -170,7 +170,8 @@ void GlobalAnalyzer::AutoInline(void)
!(f->mFlags & DTF_FUNC_VARIABLE) && !(f->mFlags & DTF_FUNC_VARIABLE) &&
!((f->mFlags & DTF_FUNC_ASSEMBLER) && !(f->mFlags & DTF_REQUEST_INLINE)) && !((f->mFlags & DTF_FUNC_ASSEMBLER) && !(f->mFlags & DTF_REQUEST_INLINE)) &&
!(f->mFlags & DTF_INTRINSIC) && !(f->mFlags & DTF_INTRINSIC) &&
!(f->mFlags & DTF_FUNC_RECURSIVE)) !(f->mFlags & DTF_FUNC_RECURSIVE) &&
!(f->mFlags & DTF_FUNC_NO_RETURN))
{ {
int nparams = 0; int nparams = 0;
Declaration* dec = f->mBase->mParams; Declaration* dec = f->mBase->mParams;
@ -619,6 +620,8 @@ void GlobalAnalyzer::AnalyzeProcedure(Expression* cexp, Expression* exp, Declara
dec->mFlags |= DTF_ANALYZED; dec->mFlags |= DTF_ANALYZED;
dec->mFlags |= DTF_FUNC_INTRSAVE; dec->mFlags |= DTF_FUNC_INTRSAVE;
if (dec->mBase->mBase && dec->mBase->mBase->mType != DT_TYPE_VOID)
dec->mFlags |= DTF_FUNC_NO_RETURN;
if (dec->mFlags & DTF_INTERRUPT) if (dec->mFlags & DTF_INTERRUPT)
dec->mFlags |= DTF_FUNC_INTRCALLED; dec->mFlags |= DTF_FUNC_INTRCALLED;
@ -1027,6 +1030,8 @@ Declaration * GlobalAnalyzer::Analyze(Expression* exp, Declaration* procDec, boo
AnalyzeProcedure(exp, procDec->mBase->mBase->mCopyConstructor->mValue, procDec->mBase->mBase->mCopyConstructor); AnalyzeProcedure(exp, procDec->mBase->mBase->mCopyConstructor->mValue, procDec->mBase->mBase->mCopyConstructor);
RegisterCall(procDec, procDec->mBase->mBase->mCopyConstructor); RegisterCall(procDec, procDec->mBase->mBase->mCopyConstructor);
} }
procDec->mFlags &= ~DTF_FUNC_NO_RETURN;
} }
break; break;
case EX_SEQUENCE: case EX_SEQUENCE:

View File

@ -1534,6 +1534,18 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateInline(Declaration* pro
if (pdec) if (pdec)
{ {
if (pdec->mBase->mType == DT_TYPE_POINTER && vr.mType->mType == DT_TYPE_INTEGER)
{
Expression* er = texp;
while (er && er->mType == EX_COMMA)
er = er->mRight;
if (er && er->mType == EX_CONSTANT && er->mDecValue->mType == DT_CONST_INTEGER && er->mDecValue->mInteger == 0)
{
mErrors->Error(exp->mLocation, EWARN_NUMERIC_0_USED_AS_NULLPTR, "Numeric 0 used for nullptr");
vr = CoerceType(proc, texp, block, inlineMapper, vr, pdec->mBase);
}
}
if (!pdec->mBase->CanAssign(vr.mType)) if (!pdec->mBase->CanAssign(vr.mType))
{ {
pdec->mBase->CanAssign(vr.mType); pdec->mBase->CanAssign(vr.mType);