Lambda in constexpr
This commit is contained in:
parent
0e6cb5557a
commit
d9106be820
|
@ -570,6 +570,7 @@ Expression* ConstexprInterpreter::EvalCall(Expression* exp)
|
||||||
else if (pex->mType == EX_VARIABLE && (pex->mDecValue->mFlags & DTF_CONST))
|
else if (pex->mType == EX_VARIABLE && (pex->mDecValue->mFlags & DTF_CONST))
|
||||||
{
|
{
|
||||||
mParams[pos] = Value(pex->mLocation, pex->mDecValue->mBase);
|
mParams[pos] = Value(pex->mLocation, pex->mDecValue->mBase);
|
||||||
|
if (pex->mDecValue->mSize > 0)
|
||||||
mParams[pos].PutConst(0, pex->mDecValue->mValue->mDecValue);
|
mParams[pos].PutConst(0, pex->mDecValue->mValue->mDecValue);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -1095,9 +1095,14 @@ const Ident* Declaration::MangleIdent(void)
|
||||||
Declaration* dec = mParams;
|
Declaration* dec = mParams;
|
||||||
while (dec)
|
while (dec)
|
||||||
{
|
{
|
||||||
const Ident* id = dec->mBase->MangleIdent();
|
const Ident* id;
|
||||||
|
if (dec->mBase)
|
||||||
|
id = dec->mBase->MangleIdent();
|
||||||
|
else
|
||||||
|
id = dec->MangleIdent();
|
||||||
if (id)
|
if (id)
|
||||||
mMangleIdent = mMangleIdent->Mangle(id->mString);
|
mMangleIdent = mMangleIdent->Mangle(id->mString);
|
||||||
|
|
||||||
dec = dec->mNext;
|
dec = dec->mNext;
|
||||||
if (dec)
|
if (dec)
|
||||||
mMangleIdent = mMangleIdent->Mangle(",");
|
mMangleIdent = mMangleIdent->Mangle(",");
|
||||||
|
@ -1178,6 +1183,15 @@ bool Declaration::ResolveTemplate(Expression* pexp, Declaration* tdec)
|
||||||
{
|
{
|
||||||
Declaration* pdec = tdec->mBase->mParams;
|
Declaration* pdec = tdec->mBase->mParams;
|
||||||
|
|
||||||
|
// Insert partially resolved templates
|
||||||
|
Declaration* ptdec = tdec->mTemplate->mParams;
|
||||||
|
while (ptdec)
|
||||||
|
{
|
||||||
|
if (ptdec->mBase)
|
||||||
|
mScope->Insert(ptdec->mIdent, ptdec->mBase);
|
||||||
|
ptdec = ptdec->mNext;
|
||||||
|
}
|
||||||
|
|
||||||
while (pexp)
|
while (pexp)
|
||||||
{
|
{
|
||||||
Expression* ex = pexp;
|
Expression* ex = pexp;
|
||||||
|
@ -1201,7 +1215,7 @@ bool Declaration::ResolveTemplate(Expression* pexp, Declaration* tdec)
|
||||||
}
|
}
|
||||||
|
|
||||||
Declaration* ppdec = nullptr;
|
Declaration* ppdec = nullptr;
|
||||||
Declaration* ptdec = tdec->mTemplate->mParams;
|
ptdec = tdec->mTemplate->mParams;
|
||||||
while (ptdec)
|
while (ptdec)
|
||||||
{
|
{
|
||||||
Declaration* pdec = mScope->Lookup(ptdec->mIdent);
|
Declaration* pdec = mScope->Lookup(ptdec->mIdent);
|
||||||
|
@ -1785,6 +1799,8 @@ bool Declaration::IsSameParams(const Declaration* dec) const
|
||||||
if (ld->mValue != rd->mValue)
|
if (ld->mValue != rd->mValue)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
else if (ld->mType == DT_TYPE_TEMPLATE || ld->mType == DT_CONST_TEMPLATE)
|
||||||
|
return false;
|
||||||
else if (!ld->mBase->IsSame(rd->mBase))
|
else if (!ld->mBase->IsSame(rd->mBase))
|
||||||
return false;
|
return false;
|
||||||
ld = ld->mNext;
|
ld = ld->mNext;
|
||||||
|
|
|
@ -4836,7 +4836,7 @@ Expression* Parser::ParseLambdaExpression(void)
|
||||||
vdec->mBase = cdec;
|
vdec->mBase = cdec;
|
||||||
vdec->mVarIndex = mLocalIndex++;
|
vdec->mVarIndex = mLocalIndex++;
|
||||||
vdec->mSize = cdec->mSize;
|
vdec->mSize = cdec->mSize;
|
||||||
vdec->mFlags |= DTF_DEFINED;
|
vdec->mFlags |= DTF_DEFINED | DTF_CONST;
|
||||||
vdec->mIdent = cdec->mIdent;
|
vdec->mIdent = cdec->mIdent;
|
||||||
|
|
||||||
Expression* vexp = new Expression(mScanner->mLocation, EX_VARIABLE);
|
Expression* vexp = new Expression(mScanner->mLocation, EX_VARIABLE);
|
||||||
|
@ -8365,6 +8365,25 @@ Declaration* Parser::ParseTemplateExpansion(Declaration* tmpld, Declaration* exp
|
||||||
|
|
||||||
Declaration* ppdec = nullptr;
|
Declaration* ppdec = nullptr;
|
||||||
Declaration* pdec = tmpld->mParams;
|
Declaration* pdec = tmpld->mParams;
|
||||||
|
|
||||||
|
// Carry over already specialized parameters
|
||||||
|
while (pdec && (pdec->mType != DT_TYPE_TEMPLATE && pdec->mType != DT_CONST_TEMPLATE))
|
||||||
|
{
|
||||||
|
Declaration* epdec = pdec->Clone();
|
||||||
|
|
||||||
|
tdec->mScope->Insert(epdec->mIdent, epdec->mBase);
|
||||||
|
epdec->mFlags |= DTF_DEFINED;
|
||||||
|
|
||||||
|
if (ppdec)
|
||||||
|
ppdec->mNext = epdec;
|
||||||
|
else
|
||||||
|
tdec->mParams = epdec;
|
||||||
|
ppdec = epdec;
|
||||||
|
|
||||||
|
pdec = pdec->mNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now to the new parameters
|
||||||
while (pdec)
|
while (pdec)
|
||||||
{
|
{
|
||||||
Declaration* epdec = pdec->Clone();
|
Declaration* epdec = pdec->Clone();
|
||||||
|
@ -8382,7 +8401,7 @@ Declaration* Parser::ParseTemplateExpansion(Declaration* tmpld, Declaration* exp
|
||||||
epdec->mBase = TheVoidTypeDeclaration;
|
epdec->mBase = TheVoidTypeDeclaration;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (epdec->mType == DT_CONST_TEMPLATE)
|
||||||
{
|
{
|
||||||
if (exp->mType == EX_CONSTANT && (exp->mDecValue->mType == DT_CONST_INTEGER || exp->mDecValue->mType == DT_CONST_TEMPLATE))
|
if (exp->mType == EX_CONSTANT && (exp->mDecValue->mType == DT_CONST_INTEGER || exp->mDecValue->mType == DT_CONST_TEMPLATE))
|
||||||
epdec->mBase = exp->mDecValue;
|
epdec->mBase = exp->mDecValue;
|
||||||
|
@ -8400,12 +8419,24 @@ Declaration* Parser::ParseTemplateExpansion(Declaration* tmpld, Declaration* exp
|
||||||
ppdec = epdec;
|
ppdec = epdec;
|
||||||
|
|
||||||
pdec = pdec->mNext;
|
pdec = pdec->mNext;
|
||||||
if (pdec)
|
if (pdec && !ConsumeTokenIf(TK_COMMA))
|
||||||
ConsumeToken(TK_COMMA);
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConsumeToken(TK_GREATER_THAN);
|
ConsumeToken(TK_GREATER_THAN);
|
||||||
|
|
||||||
|
// Partial template arguments given
|
||||||
|
if (pdec)
|
||||||
|
{
|
||||||
|
if (ppdec)
|
||||||
|
ppdec->mNext = pdec;
|
||||||
|
else
|
||||||
|
tdec->mParams = pdec;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!tmpld->mTokens)
|
||||||
|
tmpld = tmpld->mNext;
|
||||||
|
|
||||||
Declaration* etdec = tmpld->mNext;
|
Declaration* etdec = tmpld->mNext;
|
||||||
while (etdec && !etdec->IsSameParams(tdec))
|
while (etdec && !etdec->IsSameParams(tdec))
|
||||||
|
@ -8417,16 +8448,16 @@ Declaration* Parser::ParseTemplateExpansion(Declaration* tmpld, Declaration* exp
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Declaration* epdec = tdec->mParams;
|
Declaration* epdec = tdec->mParams;
|
||||||
while (epdec && epdec->mBase->mType != DT_TYPE_TEMPLATE && epdec->mBase->mType != DT_CONST_TEMPLATE)
|
while (epdec && epdec->mBase && epdec->mBase->mType != DT_TYPE_TEMPLATE && epdec->mBase->mType != DT_CONST_TEMPLATE)
|
||||||
epdec = epdec->mNext;
|
epdec = epdec->mNext;
|
||||||
|
|
||||||
if (epdec)
|
if (epdec)
|
||||||
{
|
{
|
||||||
// Partial template specification
|
// Partial template specification
|
||||||
Declaration * bdec = new Declaration(mScanner->mLocation, DT_TYPE_STRUCT);
|
Declaration * bdec = new Declaration(mScanner->mLocation, tmpld->mBase->mType);
|
||||||
tdec->mBase = bdec;
|
tdec->mBase = bdec;
|
||||||
bdec->mTemplate = tdec;
|
bdec->mTemplate = tdec;
|
||||||
bdec->mBase = tmpld->mBase;
|
bdec->mBase = tmpld->mBase->mBase;
|
||||||
tdec->mNext = tmpld;
|
tdec->mNext = tmpld;
|
||||||
bdec->mIdent = tdec->MangleIdent();
|
bdec->mIdent = tdec->MangleIdent();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue