diff --git a/oscar64/Compiler.cpp b/oscar64/Compiler.cpp index 95b285a..b0f545b 100644 --- a/oscar64/Compiler.cpp +++ b/oscar64/Compiler.cpp @@ -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); } diff --git a/oscar64/Errors.h b/oscar64/Errors.h index e8b3afb..3441380 100644 --- a/oscar64/Errors.h +++ b/oscar64/Errors.h @@ -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, diff --git a/oscar64/GlobalAnalyzer.cpp b/oscar64/GlobalAnalyzer.cpp index 7eb7755..bdd5c4c 100644 --- a/oscar64/GlobalAnalyzer.cpp +++ b/oscar64/GlobalAnalyzer.cpp @@ -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); } } diff --git a/oscar64/GlobalAnalyzer.h b/oscar64/GlobalAnalyzer.h index 882d731..5ae0d08 100644 --- a/oscar64/GlobalAnalyzer.h +++ b/oscar64/GlobalAnalyzer.h @@ -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); diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index c789772..5bd205b 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -1719,6 +1719,9 @@ Expression* Parser::ParseInitExpression(Declaration* dtype) } else if (!ConsumeTokenIf(TK_COMMA)) break; + + if (mScanner->mToken == TK_CLOSE_BRACE) + break; } }