From e9afd5e28404cd433cad30f3c1a137b6ec242100 Mon Sep 17 00:00:00 2001 From: drmortalwombat Date: Thu, 31 Aug 2023 20:17:39 +0200 Subject: [PATCH] Fix template function included multiple ways --- oscar64/Declaration.cpp | 16 ++++++++++++++++ oscar64/Declaration.h | 1 + oscar64/InterCodeGenerator.cpp | 2 ++ oscar64/Parser.cpp | 14 ++++++++++++-- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/oscar64/Declaration.cpp b/oscar64/Declaration.cpp index 1341d8a..73ed7fd 100644 --- a/oscar64/Declaration.cpp +++ b/oscar64/Declaration.cpp @@ -1407,6 +1407,18 @@ Declaration* Declaration::ToMutableType(void) return mMutable; } +bool Declaration::IsSameTemplate(const Declaration* dec) const +{ + if (this == dec) + return true; + if (this->mType != mType) + return false; + + if (mType == DT_CONST_FUNCTION) + return mBase->IsSame(dec->mBase); + + return false; +} bool Declaration::IsSubType(const Declaration* dec) const { @@ -1731,6 +1743,10 @@ bool Declaration::IsSame(const Declaration* dec) const return true; } + else if (mType == DT_TYPE_TEMPLATE) + { + return mIdent == dec->mIdent; + } return false; } diff --git a/oscar64/Declaration.h b/oscar64/Declaration.h index 0a9adc7..d01e043 100644 --- a/oscar64/Declaration.h +++ b/oscar64/Declaration.h @@ -287,6 +287,7 @@ public: bool IsTemplateSame(const Declaration* dec, const Declaration* tdec) const; bool IsTemplateSameParams(const Declaration* dec, const Declaration* tdec) const; + bool IsSameTemplate(const Declaration* dec) const; bool IsIntegerType(void) const; bool IsNumericType(void) const; diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 2622fd3..9d9e70c 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -1297,6 +1297,7 @@ void InterCodeGenerator::CopyStruct(InterCodeProcedure* proc, Expression* exp, I InterInstruction* psins = new InterInstruction(exp->mLocation, IC_CONSTANT); psins->mDst.mType = IT_POINTER; psins->mDst.mTemp = proc->AddTemporary(IT_POINTER); + psins->mDst.mOperandSize = 2; psins->mConst.mType = IT_POINTER; psins->mConst.mVarIndex = 0; psins->mConst.mIntConst = 0; @@ -1321,6 +1322,7 @@ void InterCodeGenerator::CopyStruct(InterCodeProcedure* proc, Expression* exp, I InterInstruction* plins = new InterInstruction(exp->mLocation, IC_CONSTANT); plins->mDst.mType = IT_POINTER; plins->mDst.mTemp = proc->AddTemporary(IT_POINTER); + plins->mDst.mOperandSize = 2; plins->mConst.mType = IT_POINTER; plins->mConst.mVarIndex = 2; plins->mConst.mIntConst = 0; diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 5d4f30d..d4f18e3 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -7812,8 +7812,18 @@ void Parser::ParseTemplateDeclaration(void) Declaration* pdec = mCompilationUnits->mScope->Insert(tdec->mQualIdent, tdec->mBase); if (pdec) { - tdec->mBase->mNext = pdec->mNext; - pdec->mNext = tdec->mBase; + Declaration* ppdec = pdec; + while (pdec && !pdec->IsSameTemplate(tdec->mBase)) + { + ppdec = pdec; + pdec = pdec->mNext; + } + + if (!pdec) + { + ppdec->mNext = tdec->mBase; + tdec->mBase->mNext = nullptr; + } } }