From: cuz Date: Tue, 11 Nov 2003 09:44:19 +0000 (+0000) Subject: Use safe shift routines X-Git-Tag: V2.12.0~1163 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=3d1e244a8af0f0db3e210fb2c2500ce44d4f8442;p=cc65 Use safe shift routines git-svn-id: svn://svn.cc65.org/cc65/trunk@2637 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/src/cc65/typeconv.c b/src/cc65/typeconv.c index 5af7e513c..4db76fb24 100644 --- a/src/cc65/typeconv.c +++ b/src/cc65/typeconv.c @@ -33,6 +33,9 @@ +/* common */ +#include "shift.h" + /* cc65 */ #include "codegen.h" #include "datatype.h" @@ -144,16 +147,8 @@ static int DoConversion (ExprDesc* Expr, int k, type* NewType) /* If the new type is signed, sign extend the value */ if (!IsSignUnsigned (NewType)) { if (Expr->ConstVal & (0x01UL << (NewBits-1))) { - /* Beware: NewBits may be 32, in which case a shift - * creates undefined behaviour if a long does also - * have 32 bits. So apply a somewhat complex special - * handling. - */ - unsigned long SignBits = ~0UL; - SignBits <<= (NewBits / 2); - NewBits -= (NewBits / 2); - SignBits <<= NewBits; - Expr->ConstVal |= SignBits; + /* Beware: Use the safe shift routine here. */ + Expr->ConstVal |= shl_l (~0UL, NewBits); } } } @@ -304,3 +299,4 @@ int TypeCast (ExprDesc* Expr) +