Fix template function included multiple ways

This commit is contained in:
drmortalwombat 2023-08-31 20:17:39 +02:00
parent da9b8f2a42
commit e9afd5e284
4 changed files with 31 additions and 2 deletions

View File

@ -1407,6 +1407,18 @@ Declaration* Declaration::ToMutableType(void)
return mMutable; 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 bool Declaration::IsSubType(const Declaration* dec) const
{ {
@ -1731,6 +1743,10 @@ bool Declaration::IsSame(const Declaration* dec) const
return true; return true;
} }
else if (mType == DT_TYPE_TEMPLATE)
{
return mIdent == dec->mIdent;
}
return false; return false;
} }

View File

@ -287,6 +287,7 @@ public:
bool IsTemplateSame(const Declaration* dec, const Declaration* tdec) const; bool IsTemplateSame(const Declaration* dec, const Declaration* tdec) const;
bool IsTemplateSameParams(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 IsIntegerType(void) const;
bool IsNumericType(void) const; bool IsNumericType(void) const;

View File

@ -1297,6 +1297,7 @@ void InterCodeGenerator::CopyStruct(InterCodeProcedure* proc, Expression* exp, I
InterInstruction* psins = new InterInstruction(exp->mLocation, IC_CONSTANT); InterInstruction* psins = new InterInstruction(exp->mLocation, IC_CONSTANT);
psins->mDst.mType = IT_POINTER; psins->mDst.mType = IT_POINTER;
psins->mDst.mTemp = proc->AddTemporary(IT_POINTER); psins->mDst.mTemp = proc->AddTemporary(IT_POINTER);
psins->mDst.mOperandSize = 2;
psins->mConst.mType = IT_POINTER; psins->mConst.mType = IT_POINTER;
psins->mConst.mVarIndex = 0; psins->mConst.mVarIndex = 0;
psins->mConst.mIntConst = 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); InterInstruction* plins = new InterInstruction(exp->mLocation, IC_CONSTANT);
plins->mDst.mType = IT_POINTER; plins->mDst.mType = IT_POINTER;
plins->mDst.mTemp = proc->AddTemporary(IT_POINTER); plins->mDst.mTemp = proc->AddTemporary(IT_POINTER);
plins->mDst.mOperandSize = 2;
plins->mConst.mType = IT_POINTER; plins->mConst.mType = IT_POINTER;
plins->mConst.mVarIndex = 2; plins->mConst.mVarIndex = 2;
plins->mConst.mIntConst = 0; plins->mConst.mIntConst = 0;

View File

@ -7812,8 +7812,18 @@ void Parser::ParseTemplateDeclaration(void)
Declaration* pdec = mCompilationUnits->mScope->Insert(tdec->mQualIdent, tdec->mBase); Declaration* pdec = mCompilationUnits->mScope->Insert(tdec->mQualIdent, tdec->mBase);
if (pdec) if (pdec)
{ {
tdec->mBase->mNext = pdec->mNext; Declaration* ppdec = pdec;
pdec->mNext = tdec->mBase; while (pdec && !pdec->IsSameTemplate(tdec->mBase))
{
ppdec = pdec;
pdec = pdec->mNext;
}
if (!pdec)
{
ppdec->mNext = tdec->mBase;
tdec->mBase->mNext = nullptr;
}
} }
} }