- werror (W_SHIFT_CHANGED,
- (tree->opval.op == LEFT_OP ? "left" : "right"));
- tree->type = EX_VALUE;
- tree->left = tree->right = NULL;
- tree->opval.val = constVal ("0");
- TETYPE (tree) = TTYPE (tree) = tree->opval.val->type;
- return tree;
+ /* if left shift then cast up */
+ if (tree->opval.op==LEFT_OP) {
+ int size = getSize(LTYPE(tree));
+ tree->left =
+ decorateType (newNode (CAST,
+ (size == 1 ? newAst_LINK(newIntLink()) :
+ (size == 2 ? newAst_LINK(newLongLink()) :
+ newAst_LINK(newIntLink()))),
+ tree->left));
+ } else {
+ werror (W_SHIFT_CHANGED,
+ (tree->opval.op == LEFT_OP ? "left" : "right"));
+ tree->type = EX_VALUE;
+ tree->left = tree->right = NULL;
+ tree->opval.val = constVal ("0");
+ TETYPE (tree) = TTYPE (tree) = tree->opval.val->type;
+ return tree;
+ }