Fix parsing of trailing comma in initializer list
This commit is contained in:
parent
8a49ffd111
commit
dcebdeaa5f
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue