{
struct Expression * e = exp->op.exp2;
-while(((e->type == 5 || e->type == 32 || e->type == 23) && e->list) || e->type == 11)
+while((e->type == 5 || e->type == 32 || e->type == 23) && e->list)
{
if(e->type == 5 || e->type == 32 || e->type == 23)
{
else
e = (*e->list).last;
}
-else if(e->type == 11)
-e = e->cast.exp;
}
if(exp->op.op == 261 && e && e->expType)
{
}
if(exp->op.exp2->destType && exp->op.op != '=')
exp->op.exp2->destType->count++;
+if(exp->op.op == SIZEOF)
+{
+struct Expression * e = exp->op.exp2;
+
+while((e->type == 5 || e->type == 32 || e->type == 23) && e->list)
+{
+if(e->type == 5 || e->type == 32 || e->type == 23)
+{
+if(e->type == 23)
+e = (*((struct Statement *)(*e->compound->compound.statements).last)->expressions).last;
+else
+e = (*e->list).last;
+}
+}
+if(e->type == 11 && e->cast.exp)
+e->cast.exp->needCast = 0x1;
+}
ProcessExpressionType(exp->op.exp2);
if(exp->op.exp2->destType && exp->op.op != '=')
exp->op.exp2->destType->count--;
{
Expression e = exp.op.exp2;
- while(((e.type == bracketsExp || e.type == extensionExpressionExp || e.type == extensionCompoundExp) && e.list) || e.type == castExp)
+ while((e.type == bracketsExp || e.type == extensionExpressionExp || e.type == extensionCompoundExp) && e.list)
{
if(e.type == bracketsExp || e.type == extensionExpressionExp || e.type == extensionCompoundExp)
{
else
e = e.list->last;
}
- else if(e.type == castExp)
- e = e.cast.exp;
}
if(exp.op.op == TokenType::sizeOf && e && e.expType)
{
type1.refCount++;
}
if(exp.op.exp2.destType && exp.op.op != '=') exp.op.exp2.destType.count++;
+ // Cannot lose the cast on a sizeof
+ if(exp.op.op == SIZEOF)
+ {
+ Expression e = exp.op.exp2;
+ while((e.type == bracketsExp || e.type == extensionExpressionExp || e.type == extensionCompoundExp) && e.list)
+ {
+ if(e.type == bracketsExp || e.type == extensionExpressionExp || e.type == extensionCompoundExp)
+ {
+ if(e.type == extensionCompoundExp)
+ e = ((Statement)e.compound.compound.statements->last).expressions->last;
+ else
+ e = e.list->last;
+ }
+ }
+ if(e.type == castExp && e.cast.exp)
+ e.cast.exp.needCast = true;
+ }
ProcessExpressionType(exp.op.exp2);
if(exp.op.exp2.destType && exp.op.op != '=') exp.op.exp2.destType.count--;
{
Expression e = exp.op.exp2;
- while(((e.type == bracketsExp || e.type == extensionExpressionExp || e.type == extensionCompoundExp) && e.list) || e.type == castExp)
+ while((e.type == bracketsExp || e.type == extensionExpressionExp || e.type == extensionCompoundExp) && e.list)
{
if(e.type == bracketsExp || e.type == extensionExpressionExp || e.type == extensionCompoundExp)
{
else
e = e.list->last;
}
- else if(e.type == castExp)
- e = e.cast.exp;
}
if(exp.op.op == TokenType::sizeOf && e && e.expType)
{