Fix template expansion of out of class constructor/destructor
This commit is contained in:
parent
34d6131471
commit
552c4945bf
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue