From 8b7e5d9a4120a76ca3aefbe4f372c549359fb1a1 Mon Sep 17 00:00:00 2001 From: bernhardheld Date: Tue, 6 Jan 2004 20:43:47 +0000 Subject: [PATCH] * src/SDCCval.c (valShift): changed from 16 to 32 bit shift count * support/valdiag/tests/overflow.c: added git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3089 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 7 ++++++- src/SDCCval.c | 16 ++++++++-------- support/valdiag/tests/overflow.c | 21 +++++++++++++++++++++ 3 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 support/valdiag/tests/overflow.c diff --git a/ChangeLog b/ChangeLog index fef60af2..156d91ee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-01-06 Bernhard Held + + * src/SDCCval.c (valShift): changed from 16 to 32 bit shift count + * support/valdiag/tests/overflow.c: added + 2004-01-06 Jesus Calvino-Fraga * as/mcs51/lkmain.c: stack must be after data when option -Y is not used @@ -28,7 +33,7 @@ * src/common.h: added ifndef/define/endif macros around the header file. Bug reported from Jesus Calvino-Fraga - + 2004-01-06 Bernhard Held * sdcc.spec: updated diff --git a/src/SDCCval.c b/src/SDCCval.c index 7c0e04da..66c6264d 100644 --- a/src/SDCCval.c +++ b/src/SDCCval.c @@ -1320,14 +1320,14 @@ valShift (value * lval, value * rval, int lr) if (SPEC_USIGN (val->type)) { SPEC_CVAL (val->type).v_ulong = lr ? - (TYPE_UDWORD) floatFromVal (lval) << (TYPE_UWORD) floatFromVal (rval) : \ - (TYPE_UDWORD) floatFromVal (lval) >> (TYPE_UWORD) floatFromVal (rval); + (TYPE_UDWORD) floatFromVal (lval) << (TYPE_UDWORD) floatFromVal (rval) : \ + (TYPE_UDWORD) floatFromVal (lval) >> (TYPE_UDWORD) floatFromVal (rval); } else { SPEC_CVAL (val->type).v_long = lr ? - (TYPE_DWORD) floatFromVal (lval) << (TYPE_UWORD) floatFromVal (rval) : \ - (TYPE_DWORD) floatFromVal (lval) >> (TYPE_UWORD) floatFromVal (rval); + (TYPE_DWORD) floatFromVal (lval) << (TYPE_UDWORD) floatFromVal (rval) : \ + (TYPE_DWORD) floatFromVal (lval) >> (TYPE_UDWORD) floatFromVal (rval); } } else @@ -1335,14 +1335,14 @@ valShift (value * lval, value * rval, int lr) if (SPEC_USIGN (val->type)) { SPEC_CVAL (val->type).v_uint = lr ? - (TYPE_UWORD) floatFromVal (lval) << (TYPE_UWORD) floatFromVal (rval) : \ - (TYPE_UWORD) floatFromVal (lval) >> (TYPE_UWORD) floatFromVal (rval); + (TYPE_UWORD) floatFromVal (lval) << (TYPE_UDWORD) floatFromVal (rval) : \ + (TYPE_UWORD) floatFromVal (lval) >> (TYPE_UDWORD) floatFromVal (rval); } else { SPEC_CVAL (val->type).v_int = lr ? - (TYPE_WORD) floatFromVal (lval) << (TYPE_UWORD) floatFromVal (rval) : \ - (TYPE_WORD) floatFromVal (lval) >> (TYPE_UWORD) floatFromVal (rval); + (TYPE_WORD) floatFromVal (lval) << (TYPE_UDWORD) floatFromVal (rval) : \ + (TYPE_WORD) floatFromVal (lval) >> (TYPE_UDWORD) floatFromVal (rval); } } return cheapestVal (val); diff --git a/support/valdiag/tests/overflow.c b/support/valdiag/tests/overflow.c new file mode 100644 index 00000000..0e92a04f --- /dev/null +++ b/support/valdiag/tests/overflow.c @@ -0,0 +1,21 @@ +volatile int i; + +#ifdef TEST0 +void foo(void) +{ + i = 10000 * 10000; /* WARNING(SDCC) */ + i = 0x4000 * 0x4000; /* WARNING(SDCC) */ +} +#endif + +#ifdef TEST1 +void foo(void) +{ + i = 1 << 10; /* WARNING(SDCC) */ + i = 1u << 10; + i = 1u << 18; /* WARNING(SDCC) */ + i = 1L << 31; + i = 1L << 32; /* WARNING(SDCC) */ +} +#endif + -- 2.30.2