* src/SDCCval.c (valShift): changed from 16 to 32 bit shift count
authorbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 6 Jan 2004 20:43:47 +0000 (20:43 +0000)
committerbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 6 Jan 2004 20:43:47 +0000 (20:43 +0000)
* 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
src/SDCCval.c
support/valdiag/tests/overflow.c [new file with mode: 0644]

index fef60af27abef53bb8905e166ee48588093359e5..156d91eef1991c159c0e05f6af24fa96101fc91d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-01-06 Bernhard Held <bernhard@bernhardheld.de>
+
+       * src/SDCCval.c (valShift): changed from 16 to 32 bit shift count
+       * support/valdiag/tests/overflow.c: added
+
 2004-01-06  Jesus Calvino-Fraga <jesusc@ece.ubc.ca>
 
        * 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 <bernhard@bernhardheld.de>
 
        * sdcc.spec: updated
index 7c0e04da24e3f947e5fb44325a9c6fa01feeacfc..66c6264d1a82ed1abffb75035d0207ff699d6ac3 100644 (file)
@@ -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 (file)
index 0000000..0e92a04
--- /dev/null
@@ -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
+