sym_link *ltype = operandType (left);
sym_link *letype = getSpec (ltype);
- resType = usualBinaryConversions (&left, &right, TRUE, FALSE);
+ resType = usualBinaryConversions (&left, &right,
+ (IS_UNSIGNED (retype) && IS_UNSIGNED (letype)) ? FALSE : TRUE,
+ FALSE);
/* if the right is a literal & power of 2
and left is unsigned then make it a
return operandFromValue (valMod (left->operand.valOperand,
right->operand.valOperand));
- resType = usualBinaryConversions (&left, &right, TRUE, FALSE);
+ resType = usualBinaryConversions (&left, &right,
+ (IS_UNSIGNED (retype) && IS_UNSIGNED (letype)) ? FALSE : TRUE,
+ FALSE);
/* now they are the same size */
ic = newiCode ('%', left, right);
geniCodeArray (operand * left, operand * right,int lvl)
{
iCode *ic;
+ operand *size;
sym_link *ltype = operandType (left);
bool indexUnsigned;
return geniCodeDerefPtr (geniCodeAdd (left, right, lvl), lvl);
}
+ size = operandFromLit (getSize (ltype->next));
+ SPEC_USIGN (getSpec (operandType (size))) = 1;
indexUnsigned = IS_UNSIGNED (getSpec (operandType (right)));
- right = geniCodeMultiply (right,
- operandFromLit (getSize (ltype->next)), (getArraySizePtr(left) >= INTSIZE));
+ right = geniCodeMultiply (right, size, (getArraySizePtr(left) >= INTSIZE));
/* Even if right is a 'unsigned char', the result will be a 'signed int' due to the promotion rules.
It doesn't make sense when accessing arrays, so let's fix it here: */
if (indexUnsigned)