Fix template expansion of out of class constructor/destructor

This commit is contained in:
drmortalwombat 2024-08-16 18:03:32 +02:00
parent 34d6131471
commit 552c4945bf

View File

@ -4529,7 +4529,7 @@ Declaration* Parser::ParseDeclaration(Declaration * pdec, bool variable, bool ex
} }
} }
pdec->mFlags |= ndec->mFlags & DTF_REQUEST_INLINE; pdec->mFlags |= ndec->mFlags & (DTF_REQUEST_INLINE | DTF_PREVENT_INLINE);
ndec = pdec; ndec = pdec;
} }
@ -10344,7 +10344,9 @@ void Parser::ParseTemplateDeclarationBody(Declaration * tdec, Declaration * pthi
Declaration* bdec = ParseBaseTypeDeclaration(0, true); Declaration* bdec = ParseBaseTypeDeclaration(0, true);
Declaration* adec = nullptr; Declaration* adec = nullptr;
if (ConsumeTokenIf(TK_COLCOLON) && ExpectToken(TK_IDENT) && mScanner->mTokenIdent == bdec->mTemplate->mIdent) if (ConsumeTokenIf(TK_COLCOLON))
{
if (mScanner->mToken == TK_IDENT && mScanner->mTokenIdent == bdec->mTemplate->mIdent)
{ {
mScanner->NextToken(); mScanner->NextToken();
@ -10361,6 +10363,26 @@ void Parser::ParseTemplateDeclarationBody(Declaration * tdec, Declaration * pthi
strcat_s(buffer, adec->mIdent->mString); strcat_s(buffer, adec->mIdent->mString);
adec->mQualIdent = Ident::Unique(buffer); adec->mQualIdent = Ident::Unique(buffer);
} }
else if (ConsumeToken(TK_BINARY_NOT) && mScanner->mToken == TK_IDENT && mScanner->mTokenIdent == bdec->mTemplate->mIdent)
{
mScanner->NextToken();
Declaration* ctdec = ParseFunctionDeclaration(TheVoidTypeDeclaration);
adec = new Declaration(ctdec->mLocation, DT_CONST_FUNCTION);
adec->mBase = ctdec;
adec->mIdent = bdec->mTemplate->mIdent->PreMangle("~");
char buffer[200];
strcpy_s(buffer, bdec->mTemplate->mQualIdent->mString);
strcat_s(buffer, "::");
strcat_s(buffer, adec->mIdent->mString);
adec->mQualIdent = Ident::Unique(buffer);
}
else
mErrors->Error(bdec->mLocation, EERR_FUNCTION_TEMPLATE, "Constructor or destructor expected");
}
else else
{ {
if (bdec && pthis && bdec == pthis->mBase && mScanner->mToken == TK_OPEN_PARENTHESIS) if (bdec && pthis && bdec == pthis->mBase && mScanner->mToken == TK_OPEN_PARENTHESIS)
@ -10406,6 +10428,29 @@ void Parser::ParseTemplateDeclarationBody(Declaration * tdec, Declaration * pthi
tdec->mBase = adec; tdec->mBase = adec;
adec->mTemplate = tdec; adec->mTemplate = tdec;
if (ConsumeTokenIf(TK_COLON))
{
if (adec->mIdent->mString[0] != '+')
mErrors->Error(bdec->mLocation, EERR_FUNCTION_TEMPLATE, "Function template body for non constructor expected");
do {
ConsumeToken(TK_IDENT);
if (ConsumeToken(TK_OPEN_PARENTHESIS))
{
int qdepth = 1;
while (qdepth)
{
if (ConsumeTokenIf(TK_OPEN_PARENTHESIS))
qdepth++;
else if (ConsumeTokenIf(TK_CLOSE_PARENTHESIS))
qdepth--;
else
mScanner->NextToken();
}
}
} while (ConsumeTokenIf(TK_COMMA));
}
if (ConsumeTokenIf(TK_OPEN_BRACE)) if (ConsumeTokenIf(TK_OPEN_BRACE))
{ {
int qdepth = 1; int qdepth = 1;