Fix array[] parameters in functions
This commit is contained in:
parent
a3d8c94620
commit
180da3de4a
|
@ -1634,12 +1634,16 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration*
|
||||||
vl = Dereference(proc, block, vl);
|
vl = Dereference(proc, block, vl);
|
||||||
if (!vl.mType->IsNumericType())
|
if (!vl.mType->IsNumericType())
|
||||||
mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Not a numeric type");
|
mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Not a numeric type");
|
||||||
|
else if (vl.mType->mType == DT_TYPE_INTEGER && vl.mType->mSize < 2)
|
||||||
|
vl = CoerceType(proc, block, vl, TheSignedIntTypeDeclaration);
|
||||||
ins->mOperator = IA_NEG;
|
ins->mOperator = IA_NEG;
|
||||||
break;
|
break;
|
||||||
case TK_BINARY_NOT:
|
case TK_BINARY_NOT:
|
||||||
vl = Dereference(proc, block, vl);
|
vl = Dereference(proc, block, vl);
|
||||||
if (!(vl.mType->mType == DT_TYPE_POINTER || vl.mType->IsNumericType()))
|
if (!(vl.mType->mType == DT_TYPE_POINTER || vl.mType->IsNumericType()))
|
||||||
mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Not a numeric or pointer type");
|
mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_OPERATOR, "Not a numeric or pointer type");
|
||||||
|
else if (vl.mType->mType == DT_TYPE_INTEGER && vl.mType->mSize < 2)
|
||||||
|
vl = CoerceType(proc, block, vl, TheUnsignedIntTypeDeclaration);
|
||||||
ins->mOperator = IA_NOT;
|
ins->mOperator = IA_NOT;
|
||||||
break;
|
break;
|
||||||
case TK_MUL:
|
case TK_MUL:
|
||||||
|
|
|
@ -431,16 +431,23 @@ Declaration* Parser::ParsePostfixDeclaration(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!(adec->mBase->mFlags & DTF_DEFINED))
|
if (!(adec->mBase->mFlags & DTF_DEFINED) && adec->mBase->mType != DT_TYPE_ARRAY)
|
||||||
mErrors->Error(adec->mLocation, EERR_UNDEFINED_OBJECT, "Type of argument not defined");
|
mErrors->Error(adec->mLocation, EERR_UNDEFINED_OBJECT, "Type of argument not defined");
|
||||||
|
|
||||||
adec->mType = DT_ARGUMENT;
|
adec->mType = DT_ARGUMENT;
|
||||||
adec->mVarIndex = vi;
|
adec->mVarIndex = vi;
|
||||||
adec->mOffset = 0;
|
adec->mOffset = 0;
|
||||||
if (adec->mBase->mType == DT_TYPE_ARRAY)
|
if (adec->mBase->mType == DT_TYPE_ARRAY)
|
||||||
adec->mSize = 2;
|
{
|
||||||
else
|
Declaration * ndec = new Declaration(adec->mBase->mLocation, DT_TYPE_POINTER);
|
||||||
|
ndec->mBase = adec->mBase->mBase;
|
||||||
|
ndec->mSize = 2;
|
||||||
|
ndec->mFlags |= DTF_DEFINED;
|
||||||
|
adec->mBase = ndec;
|
||||||
|
}
|
||||||
|
|
||||||
adec->mSize = adec->mBase->mSize;
|
adec->mSize = adec->mBase->mSize;
|
||||||
|
|
||||||
vi += adec->mSize;
|
vi += adec->mSize;
|
||||||
if (pdec)
|
if (pdec)
|
||||||
pdec->mNext = adec;
|
pdec->mNext = adec;
|
||||||
|
|
Loading…
Reference in New Issue