Fix parsing of trailing comma in initializer list

This commit is contained in:
drmortalwombat 2024-01-21 09:25:34 +01:00
parent 8a49ffd111
commit dcebdeaa5f
5 changed files with 19 additions and 10 deletions

View File

@ -889,7 +889,7 @@ bool Compiler::GenerateCode(void)
{
Declaration* dec = mCompilationUnits->mReferenced[i];
if (dec->mType == DT_CONST_FUNCTION)
mGlobalAnalyzer->AnalyzeProcedure(dec->mValue, dec);
mGlobalAnalyzer->AnalyzeProcedure(nullptr, dec->mValue, dec);
else
mGlobalAnalyzer->AnalyzeGlobalVariable(dec);
}

View File

@ -20,6 +20,7 @@ enum ErrorID
EINFO_GENERIC = 1000,
EINFO_EXPANDED = 1001,
EINFO_ORIGINAL_DEFINITION = 1002,
EINFO_CALLED_FROM = 1003,
EWARN_GENERIC = 2000,
EWARN_CONSTANT_TRUNCATED,

View File

@ -553,7 +553,7 @@ void GlobalAnalyzer::UndoParamReference(Expression* exp, Declaration * param)
}
}
void GlobalAnalyzer::AnalyzeProcedure(Expression* exp, Declaration* dec)
void GlobalAnalyzer::AnalyzeProcedure(Expression* cexp, Expression* exp, Declaration* dec)
{
dec->mUseCount++;
@ -609,7 +609,12 @@ void GlobalAnalyzer::AnalyzeProcedure(Expression* exp, Declaration* dec)
}
}
else
{
mErrors->Error(dec->mLocation, EERR_UNDEFINED_OBJECT, "Calling undefined function", dec->mQualIdent);
if (cexp)
mErrors->Error(cexp->mLocation, EINFO_CALLED_FROM, "Called from here");
}
dec->mFlags &= ~DTF_FUNC_ANALYZING;
}
@ -646,12 +651,12 @@ void GlobalAnalyzer::AnalyzeAssembler(Expression* exp, Declaration* procDec)
}
else if (adec->mType == DT_FUNCTION_REF)
{
AnalyzeProcedure(adec->mBase->mValue, adec->mBase);
AnalyzeProcedure(exp, adec->mBase->mValue, adec->mBase);
RegisterProc(adec->mBase);
}
else if (adec->mType == DT_CONST_FUNCTION)
{
AnalyzeProcedure(adec->mValue, adec);
AnalyzeProcedure(exp, adec->mValue, adec);
RegisterCall(procDec, adec);
}
}
@ -706,7 +711,7 @@ Declaration * GlobalAnalyzer::Analyze(Expression* exp, Declaration* procDec, boo
exp->mDecValue->mReferences.Push(exp);
if (exp->mDecValue->mType == DT_CONST_FUNCTION)
AnalyzeProcedure(exp->mDecValue->mValue, exp->mDecValue);
AnalyzeProcedure(exp, exp->mDecValue->mValue, exp->mDecValue);
else if (exp->mDecValue->mType == DT_CONST_STRUCT)
{
AnalyzeInit(exp->mDecValue->mParams);
@ -925,10 +930,10 @@ Declaration * GlobalAnalyzer::Analyze(Expression* exp, Declaration* procDec, boo
{
if (pdec->mBase->mMoveConstructor)
{
AnalyzeProcedure(pdec->mBase->mMoveConstructor->mValue, pdec->mBase->mMoveConstructor);
AnalyzeProcedure(exp, pdec->mBase->mMoveConstructor->mValue, pdec->mBase->mMoveConstructor);
RegisterCall(procDec, pdec->mBase->mMoveConstructor);
}
AnalyzeProcedure(pdec->mBase->mCopyConstructor->mValue, pdec->mBase->mCopyConstructor);
AnalyzeProcedure(exp, pdec->mBase->mCopyConstructor->mValue, pdec->mBase->mCopyConstructor);
RegisterCall(procDec, pdec->mBase->mCopyConstructor);
}
@ -959,10 +964,10 @@ Declaration * GlobalAnalyzer::Analyze(Expression* exp, Declaration* procDec, boo
{
if (procDec->mBase->mBase->mMoveConstructor)
{
AnalyzeProcedure(procDec->mBase->mBase->mMoveConstructor->mValue, procDec->mBase->mBase->mMoveConstructor);
AnalyzeProcedure(exp, procDec->mBase->mBase->mMoveConstructor->mValue, procDec->mBase->mBase->mMoveConstructor);
RegisterCall(procDec, procDec->mBase->mBase->mMoveConstructor);
}
AnalyzeProcedure(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);
}
}

View File

@ -17,7 +17,7 @@ public:
void AutoZeroPage(LinkerSection * lszp, int zpsize);
void MarkRecursions(void);
void AnalyzeProcedure(Expression* exp, Declaration* procDec);
void AnalyzeProcedure(Expression* cexp, Expression* exp, Declaration* procDec);
void AnalyzeAssembler(Expression* exp, Declaration* procDec);
void AnalyzeGlobalVariable(Declaration* dec);

View File

@ -1719,6 +1719,9 @@ Expression* Parser::ParseInitExpression(Declaration* dtype)
}
else if (!ConsumeTokenIf(TK_COMMA))
break;
if (mScanner->mToken == TK_CLOSE_BRACE)
break;
}
}