Fixed array size template parameter

This commit is contained in:
drmortalwombat 2025-05-18 11:35:13 +02:00
parent 70eb7a5eab
commit c86dc364b1
2 changed files with 28 additions and 3 deletions

View File

@ -2083,6 +2083,21 @@ bool Declaration::ResolveTemplate(Declaration* fdec, Declaration* tdec, bool sam
}
return true;
}
else if (tdec->mType == DT_TYPE_ARRAY && fdec->mType == DT_TYPE_ARRAY && tdec->mTemplate && tdec->mBase->IsConstSame(fdec->mBase))
{
Declaration* ifdec = new Declaration(fdec->mLocation, DT_CONST_INTEGER);
ifdec->mBase = TheSignedIntTypeDeclaration;
ifdec->mSize = 2;
ifdec->mInteger = fdec->mSize / fdec->mBase->mSize;
Declaration * ipdec = mScope->Insert(tdec->mTemplate->mIdent, ifdec);
if (ipdec && !ipdec->IsSame(ifdec))
return false;
return true;
}
else if (tdec->mType == DT_TYPE_STRUCT && fdec->mType == DT_TYPE_STRUCT && tdec->mTemplate)
{

View File

@ -1367,8 +1367,18 @@ Declaration* Parser::ParsePostfixDeclaration(void)
if (mScanner->mToken != TK_CLOSE_BRACKET)
{
Expression* exp = ParseRExpression();
if (exp->mType == EX_CONSTANT && exp->mDecType->IsIntegerType() && exp->mDecValue->mType == DT_CONST_INTEGER)
ndec->mSize = int(exp->mDecValue->mInteger);
if (exp->mType == EX_CONSTANT && exp->mDecType->IsIntegerType())
{
if (exp->mDecValue->mType == DT_CONST_INTEGER)
ndec->mSize = int(exp->mDecValue->mInteger);
else if (exp->mDecValue->mType == DT_CONST_TEMPLATE)
{
ndec->mSize = 0;
ndec->mTemplate = exp->mDecValue;
}
else
mErrors->Error(exp->mLocation, EERR_CONSTANT_TYPE, "Constant integer expression expected");
}
else
mErrors->Error(exp->mLocation, EERR_CONSTANT_TYPE, "Constant integer expression expected");
ndec->mFlags |= DTF_DEFINED;
@ -1505,7 +1515,7 @@ Declaration * Parser::ParseFunctionDeclaration(Declaration* bdec)
adec->mType = DT_ARGUMENT;
adec->mVarIndex = vi;
adec->mOffset = 0;
if (adec->mBase->mType == DT_TYPE_ARRAY)
if (adec->mBase->mType == DT_TYPE_ARRAY && !adec->mBase->mTemplate)
{
Declaration* ndec = new Declaration(adec->mBase->mLocation, DT_TYPE_POINTER);
ndec->mBase = adec->mBase->mBase;