unsigned but-fields were sometimes sign-extended when converted to int
authorceriel <none@none>
Fri, 18 May 1990 10:29:57 +0000 (10:29 +0000)
committerceriel <none@none>
Fri, 18 May 1990 10:29:57 +0000 (10:29 +0000)
lang/cem/cemcom.ansi/arith.c
lang/cem/cemcom.ansi/field.c

index 81309bc..08c1464 100644 (file)
@@ -592,19 +592,17 @@ field2arith(expp)
        */
        register struct type *tp = (*expp)->ex_type->tp_up;
        register struct field *fd = (*expp)->ex_type->tp_field;
-       register struct type *atype = (tp->tp_unsigned
-                                       && fd->fd_width >= 8 * word_size)
-                                           ? uword_type
-                                           : word_type;
 
-       (*expp)->ex_type = atype;
+       (*expp)->ex_type = word_type;
 
        if (tp->tp_unsigned)    {       /* don't worry about the sign bit */
+               if (fd->fd_width >= 8 * word_size)
+                       (*expp)->ex_type = uword_type;
                ch3bin(expp, RIGHT, intexpr((arith)fd->fd_shift, INT));
                ch3bin(expp, '&', intexpr(fd->fd_mask, INT));
        }
        else    {       /* take care of the sign bit: sign extend if needed */
-               arith bits_in_type = atype->tp_size * 8;
+               arith bits_in_type = word_size * 8;
 
                ch3bin(expp, LEFT,
                        intexpr(bits_in_type - fd->fd_width - fd->fd_shift,
index 15a7821..9cef7b4 100644 (file)
@@ -82,7 +82,7 @@ eval_field(expr, code)
                        StoreLocal(tmpvar, pointer_size);
                        C_loi(word_size);
                }
-               if (atype->tp_unsigned) {
+               if (tp->tp_unsigned) {
                        C_loc((arith)fd->fd_shift);
                        C_sru(word_size);
                        C_loc(fd->fd_mask);
@@ -117,7 +117,7 @@ eval_field(expr, code)
                        the bit field (i.e. the value that is got on
                        retrieval) is on top of stack.
                */
-               if (atype->tp_unsigned == 0) {  /* sign extension */
+               if (tp->tp_unsigned == 0) {     /* sign extension */
                        register arith shift = word_size * 8 - fd->fd_width;
 
                        C_loc(shift);