Fix removal of function reference result if only used as target

This commit is contained in:
drmortalwombat 2025-05-03 17:22:18 +02:00
parent 885d6ff706
commit 500cce511f
3 changed files with 44 additions and 4 deletions

View File

@ -1823,6 +1823,9 @@ bool Declaration::ResolveTemplateParameterList(Expression* pexp, Declaration* pd
{
if (pdec->mType == DT_PACK_ARGUMENT)
{
if (preliminary)
return true;
Declaration* tpdec = new Declaration(pdec->mLocation, DT_PACK_TYPE);
if (pdec->mBase->mType == DT_TYPE_REFERENCE)
tpdec->mIdent = pdec->mBase->mBase->mIdent;
@ -2120,7 +2123,19 @@ bool Declaration::ResolveTemplate(Declaration* fdec, Declaration* tdec, bool sam
tpdec = tpdec->mNext;
}
return !fpdec && !tpdec;
if (fpdec)
return false;
else if (!tpdec)
return true;
else if (tpdec->mBase->mType == DT_PACK_TEMPLATE)
{
Declaration*tppack = new Declaration(tpdec->mLocation, DT_PACK_TYPE);
Declaration* pdec = mScope->Insert(tpdec->mBase->mIdent, tppack);
return true;
}
else
return false;
}
ftdec = ftdec->mNext;

View File

@ -333,7 +333,7 @@ bool GlobalOptimizer::Optimize(void)
if (!(func->mOptFlags & OPTF_FUNC_VARIABLE) && !(func->mBase->mFlags & DTF_VIRTUAL))
{
if (!(func->mOptFlags & OPTF_VAR_USED) && func->mBase->mBase && (func->mBase->mBase->IsSimpleType() || func->mBase->mBase->IsReference()))
if (!(func->mOptFlags & (OPTF_VAR_USED | OPTF_VAR_ADDRESS)) && func->mBase->mBase && (func->mBase->mBase->IsSimpleType() || func->mBase->mBase->IsReference()))
{
#if DUMP_OPTS
printf("Remove return value\n");

View File

@ -10967,11 +10967,17 @@ void Parser::ParseTemplateArguments(Declaration* tmpld, Declaration* tdec)
{
ConsumeToken(TK_LESS_THAN);
Declaration* tparm = tmpld->mParams;
Declaration* ppdec = nullptr;
if (!ConsumeTokenIf(TK_GREATER_THAN))
{
Declaration* tparm = tmpld->mParams;
while (tmpld->mNext && !tparm)
{
tmpld = tmpld->mNext;
tparm = tmpld->mParams;
}
do
{
Expression* exp;
@ -11094,6 +11100,7 @@ Declaration* Parser::ParseTemplateExpansion(Declaration* tmpld, Declaration* exp
ParseTemplateArguments(tmpld, tdec);
}
Declaration* tmplpd = tmpld;
while (!tmpld->mTokens)
tmpld = tmpld->mNext;
@ -11112,7 +11119,7 @@ Declaration* Parser::ParseTemplateExpansion(Declaration* tmpld, Declaration* exp
tdec->mQualIdent = tmpld->mQualIdent;
tdec->mScope->mName = tdec->mIdent;
tdec->mNext = tmpld;
bdec->mIdent = tdec->MangleIdent();
bdec->mIdent = tdec->mIdent->Mangle(tdec->MangleIdent()->mString);
return bdec;
}
@ -11159,6 +11166,18 @@ Declaration* Parser::ParseTemplateExpansion(Declaration* tmpld, Declaration* exp
{
rdec = new Declaration(tdec->mLocation, DT_PACK_TYPE);
}
else if (!dec)
{
Declaration* packd = new Declaration(tdec->mLocation, DT_PACK_TEMPLATE);
packd->mBase = new Declaration(tdec->mLocation, DT_PACK_TYPE);
if (ppdec)
ppdec->mNext = packd;
else
tdec->mParams = packd;
ppdec = nullptr;
dec = packd;
}
else if (dec->mType != DT_PACK_TEMPLATE)
{
Declaration* packd = new Declaration(dec->mLocation, DT_PACK_TEMPLATE);
@ -11186,6 +11205,11 @@ Declaration* Parser::ParseTemplateExpansion(Declaration* tmpld, Declaration* exp
dec = packd;
}
}
else
{
ppdec = dec;
dec = dec->mNext;
}
if (rdec)
{
@ -11335,6 +11359,7 @@ Declaration* Parser::ParseTemplateExpansion(Declaration* tmpld, Declaration* exp
p->mScanner->Replay(tmpld->mTokens);
tdec->mIdent = tmpld->mIdent;
tdec->mScope->mName = tdec->MangleIdent();
tdec->mNext = tmpld->mNext;
tmpld->mNext = tdec;