* src/SDCCglue.c (printIvalBitFields): fixed bug 1806631
[fw/sdcc] / support / regression / tests / constantRange.c
index 5c1feeef58b0a340f5540f827262ba03fc07192e..3b0d283cda3f632182a0a4169ba3c599388fd44f 100644 (file)
@@ -8,6 +8,13 @@
 #include <inttypes.h>
 #else
 #include <stdint.h>
+#endif
+
+#if defined (__GNUC__) && defined (__alpha__) && (__GNUC__ < 3)
+/* bool should be casted to int in order to pass the test. Is this a gcc bug? */
+#define INT_CAST  (int)
+#else
+#define INT_CAST
 #endif
 
  int8_t s8;
@@ -66,15 +73,23 @@ testConstantRange (void)
   ASSERT (! (UINT16_MAX + 1L == u16));
   ASSERT (  (         0 - 1  != u16));
   ASSERT (  (UINT16_MAX + 1L != u16));
-  ASSERT (  (         0 - 1  <  u16));
   ASSERT (! (UINT16_MAX      <  u16));
   ASSERT (  (         0      <= u16));
   ASSERT (! (UINT16_MAX + 1L <= u16));
   ASSERT (! (         0      >  u16));
   ASSERT (  (UINT16_MAX + 1L >  u16));
-  ASSERT (! (         0 - 1  >= u16));
   ASSERT (  (UINT16_MAX      >= u16));
 
+#if defined(PORT_HOST)
+/* on 32bit host: -1 is presented as 32 bit int, 16 bit unsigned short is promoted to 32 bit int */
+  ASSERT (  (         0 - 1  <  u16)); /* -1 > 0 */
+  ASSERT (! (         0 - 1  >= u16)); /* !(-1 <= 0) */
+#else
+/* on 16bit sdcc: int (-1) is promoted to unsigned int (0xffff) */
+  ASSERT (  (         0 - 1  >  u16)); /* 0xffff > 0 */
+  ASSERT (! (         0 - 1  <= u16)); /* !(0xffff <= 0) */
+#endif
+
    /* sdcc can't hold a number (INT32_MIN - 1) or (INT32_MAX + 1),
       there's no 'double' or 'long long' */
 /* ASSERT (! (INT32_MIN - 1 == s32)); */
@@ -94,19 +109,21 @@ testConstantRange (void)
 /* ASSERT (! (UINT32_MAX + 1 == u32)); */
    ASSERT (  (         0 - 1 != u32));
 /* ASSERT (  (UINT32_MAX + 1 != u32)); */
-   ASSERT (  (         0 - 1 <  u32));
+   ASSERT (  (         0 - 1 >  u32)); /* 0xffffffff > 0 */
    ASSERT (! (UINT32_MAX     <  u32));
    ASSERT (  (         0     <= u32));
 /* ASSERT (! (UINT32_MAX + 1 <= u32)); */
    ASSERT (! (         0     >  u32));
 /* ASSERT (  (UINT32_MAX + 1 >  u32)); */
-   ASSERT (! (         0 - 1 >= u32));
+   ASSERT (! (         0 - 1 <= u32)); /* !(0xffffffff <= 0) */
    ASSERT (  (UINT32_MAX     >= u32));
 }
 
 void
 testFoo1(void)
 {
+#ifdef __bool_true_false_are_defined
+
 #if defined(PORT_HOST)
    volatile bool sb, ub;
 #else
@@ -125,7 +142,7 @@ testFoo1(void)
   ASSERT (! ( 0 != sb));
   ASSERT (  ( 1 != sb));
 
-  ASSERT (  (-1 <  sb));
+  ASSERT (  (-1 <  INT_CAST sb));
   ASSERT (! ( 0 <  sb));
 
   ASSERT (  ( 0 <= sb));
@@ -134,7 +151,7 @@ testFoo1(void)
   ASSERT (! ( 0 >  sb));
   ASSERT (  ( 1 >  sb));
 
-  ASSERT (! (-1 >= sb));
+  ASSERT (! (-1 >= INT_CAST sb));
   ASSERT (  ( 0 >= sb));
 
 
@@ -146,7 +163,7 @@ testFoo1(void)
   ASSERT (! ( 0 != ub));
   ASSERT (  ( 1 != ub));
 
-  ASSERT (  (-1 <  ub));
+  ASSERT (  (-1 <  INT_CAST ub));
   ASSERT (! ( 0 <  ub));
 
   ASSERT (  ( 0 <= ub));
@@ -155,8 +172,9 @@ testFoo1(void)
   ASSERT (! ( 0 >  ub));
   ASSERT (  ( 1 >  ub));
 
-  ASSERT (! (-1 >= ub));
+  ASSERT (! (-1 >= INT_CAST ub));
   ASSERT (  ( 0 >= ub));
+#endif //__bool_true_false_are_defined
 }
 
 void