From: ceriel Date: Fri, 18 May 1990 10:29:57 +0000 (+0000) Subject: unsigned but-fields were sometimes sign-extended when converted to int X-Git-Tag: release-5-5~1709 X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=c4dabcd9a4d79be34008733d35a92ee39acd784e;p=ack.git unsigned but-fields were sometimes sign-extended when converted to int --- diff --git a/lang/cem/cemcom.ansi/arith.c b/lang/cem/cemcom.ansi/arith.c index 81309bc29..08c146431 100644 --- a/lang/cem/cemcom.ansi/arith.c +++ b/lang/cem/cemcom.ansi/arith.c @@ -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, diff --git a/lang/cem/cemcom.ansi/field.c b/lang/cem/cemcom.ansi/field.c index 15a782165..9cef7b465 100644 --- a/lang/cem/cemcom.ansi/field.c +++ b/lang/cem/cemcom.ansi/field.c @@ -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);