- /* special case for left shift operation : cast up right->left if type of left
- has greater size than right */
- if (tree->left && tree->right && tree->right->opval.op == LEFT_OP) {
- int lsize = getSize(LTYPE(tree));
- int rsize = getSize(RTYPE(tree));
-
- if (lsize > rsize) {
- tree->right->decorated = 0;
- tree->right->left = newNode( CAST, (lsize == 2 ?
- newAst_LINK(newIntLink()) :
- newAst_LINK(newLongLink())),
- tree->right->left);
- tree->right = decorateType(tree->right);
- }
+ if (IS_AST_OP(tree) &&
+ (tree->opval.op == CAST || tree->opval.op == '=') &&
+ (getSize(LTYPE(tree)) > getSize(RTYPE(tree))) &&
+ (getSize(RTYPE(tree)) < INTSIZE)) {
+ // this is a cast/assign to a bigger type
+ if (IS_AST_OP(tree->right) &&
+ IS_INTEGRAL(tree->right->ftype) &&
+ (tree->right->opval.op == LEFT_OP ||
+ tree->right->opval.op == '*' ||
+ tree->right->opval.op == '+' ||
+ tree->right->opval.op == '-') &&
+ tree->right->right) {
+ // we should cast an operand instead of the result
+ tree->right->decorated = 0;
+ tree->right->left = newNode( CAST, newAst_LINK(newIntLink()),
+ tree->right->left);
+ tree->right = decorateType(tree->right);
+ }