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]; Declaration* dec = mCompilationUnits->mReferenced[i];
if (dec->mType == DT_CONST_FUNCTION) if (dec->mType == DT_CONST_FUNCTION)
mGlobalAnalyzer->AnalyzeProcedure(dec->mValue, dec); mGlobalAnalyzer->AnalyzeProcedure(nullptr, dec->mValue, dec);
else else
mGlobalAnalyzer->AnalyzeGlobalVariable(dec); mGlobalAnalyzer->AnalyzeGlobalVariable(dec);
} }

View File

@ -20,6 +20,7 @@ enum ErrorID
EINFO_GENERIC = 1000, EINFO_GENERIC = 1000,
EINFO_EXPANDED = 1001, EINFO_EXPANDED = 1001,
EINFO_ORIGINAL_DEFINITION = 1002, EINFO_ORIGINAL_DEFINITION = 1002,
EINFO_CALLED_FROM = 1003,
EWARN_GENERIC = 2000, EWARN_GENERIC = 2000,
EWARN_CONSTANT_TRUNCATED, 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++; dec->mUseCount++;
@ -609,7 +609,12 @@ void GlobalAnalyzer::AnalyzeProcedure(Expression* exp, Declaration* dec)
} }
} }
else else
{
mErrors->Error(dec->mLocation, EERR_UNDEFINED_OBJECT, "Calling undefined function", dec->mQualIdent); 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; dec->mFlags &= ~DTF_FUNC_ANALYZING;
} }
@ -646,12 +651,12 @@ void GlobalAnalyzer::AnalyzeAssembler(Expression* exp, Declaration* procDec)
} }
else if (adec->mType == DT_FUNCTION_REF) else if (adec->mType == DT_FUNCTION_REF)
{ {
AnalyzeProcedure(adec->mBase->mValue, adec->mBase); AnalyzeProcedure(exp, adec->mBase->mValue, adec->mBase);
RegisterProc(adec->mBase); RegisterProc(adec->mBase);
} }
else if (adec->mType == DT_CONST_FUNCTION) else if (adec->mType == DT_CONST_FUNCTION)
{ {
AnalyzeProcedure(adec->mValue, adec); AnalyzeProcedure(exp, adec->mValue, adec);
RegisterCall(procDec, adec); RegisterCall(procDec, adec);
} }
} }
@ -706,7 +711,7 @@ Declaration * GlobalAnalyzer::Analyze(Expression* exp, Declaration* procDec, boo
exp->mDecValue->mReferences.Push(exp); exp->mDecValue->mReferences.Push(exp);
if (exp->mDecValue->mType == DT_CONST_FUNCTION) 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) else if (exp->mDecValue->mType == DT_CONST_STRUCT)
{ {
AnalyzeInit(exp->mDecValue->mParams); AnalyzeInit(exp->mDecValue->mParams);
@ -925,10 +930,10 @@ Declaration * GlobalAnalyzer::Analyze(Expression* exp, Declaration* procDec, boo
{ {
if (pdec->mBase->mMoveConstructor) 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); 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); RegisterCall(procDec, pdec->mBase->mCopyConstructor);
} }
@ -959,10 +964,10 @@ Declaration * GlobalAnalyzer::Analyze(Expression* exp, Declaration* procDec, boo
{ {
if (procDec->mBase->mBase->mMoveConstructor) 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); 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); RegisterCall(procDec, procDec->mBase->mBase->mCopyConstructor);
} }
} }

View File

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

View File

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