[PPL-devel] [GIT] ppl/ppl(bounded_arithmetic): Silenced bogus comparison warnings.

Abramo Bagnara abramo.bagnara at gmail.com
Thu May 14 12:14:34 CEST 2009


Module: ppl/ppl
Branch: bounded_arithmetic
Commit: 6c8a266be0f01266599542b7cdc3d3c2a47e62d2
URL:    http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=6c8a266be0f01266599542b7cdc3d3c2a47e62d2

Author: Abramo Bagnara <abramo.bagnara at gmail.com>
Date:   Thu May 14 09:41:30 2009 +0200

Silenced bogus comparison warnings.

---

 src/checked.inlines.hh     |   31 ++++++++++++++++++++++++++-----
 src/checked_int.inlines.hh |   18 +++++++++---------
 2 files changed, 35 insertions(+), 14 deletions(-)

diff --git a/src/checked.inlines.hh b/src/checked.inlines.hh
index a98c153..0c96381 100644
--- a/src/checked.inlines.hh
+++ b/src/checked.inlines.hh
@@ -28,6 +28,27 @@ site: http://www.cs.unipr.it/ppl/ . */
 #include "C_Integer.hh"
 #include <cassert>
 
+#if defined(__GNUC__)
+/*! \brief
+  Performs the test <CODE>a < b</CODE> avoiding the warning
+  about comparison with min or max of the type.
+*/
+#define PPL_LT_SILENT(a, b)				\
+  ({						\
+      __typeof__(a) _a = (a);			\
+      __typeof__(b) _b = (b);			\
+      _a <= _b && _a != _b;			\
+  })
+/*! \brief
+  Performs the test <CODE>a > b</CODE> avoiding the warning
+  about comparison with min or max of the type.
+*/
+#define PPL_GT_SILENT(a, b) PPL_LT_SILENT(b, a)
+#else
+#define PPL_LT_SILENT(a, b) ((a) < (b))
+#define PPL_GT_SILENT(a, b) ((a) > (b))
+#endif
+
 namespace Parma_Polyhedra_Library {
 
 namespace Checked {
@@ -439,7 +460,7 @@ inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
 			   && C_Integer<U>::value
 			   && C_Integer<S>::is_signed), bool>::type
 lt(const U& x, const S& y) {
-  return y >= 0 && x < y;
+  return y >= 0 && x < static_cast<typename C_Integer<S>::other_type>(y);
 }
 
 template <typename S, typename U>
@@ -455,7 +476,7 @@ inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
 			   && C_Integer<U>::value
 			   && C_Integer<S>::is_signed), bool>::type
 le(const U& x, const S& y) {
-  return y >= 0 && x <= y;
+  return y >= 0 && x <= static_cast<typename C_Integer<S>::other_type>(y);
 }
 
 template <typename S, typename U>
@@ -463,7 +484,7 @@ inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
 			   && C_Integer<U>::value
 			   && C_Integer<S>::is_signed), bool>::type
 eq(const S& x, const U& y) {
-  return x >= 0 && x == y;
+  return x >= 0 && static_cast<typename C_Integer<S>::other_type>(x) == y;
 }
 
 template <typename U, typename S>
@@ -471,7 +492,7 @@ inline typename Enable_If<(!Safe_Int_Comparison<S, U>::value
 			   && C_Integer<U>::value
 			   && C_Integer<S>::is_signed), bool>::type
 eq(const U& x, const S& y) {
-  return y >= 0 && x == y;
+  return y >= 0 && x == static_cast<typename C_Integer<S>::other_type>(y);
 }
 
 template <typename T1, typename T2>
@@ -480,7 +501,7 @@ inline typename Enable_If<(!Safe_Conversion<T1, T2>::value
 			   && (!C_Integer<T1>::value || !C_Integer<T2>::value)), bool>::type
 eq(const T1& x, const T2& y) {
   PPL_DIRTY_TEMP(T1, tmp);
-  Result r = assign_r(tmp, y, static_cast<Rounding_Dir>(ROUND_DIRECT | ROUND_FPU_CHECK_INEXACT));
+  Result r = assign_r(tmp, y, ROUND_CHECK);
   // FIXME: We can do this also without fpu inexact check using a
   // conversion back and forth and then testing equality.  We should
   // code this in checked_float.inlines.hh, probably it's faster also
diff --git a/src/checked_int.inlines.hh b/src/checked_int.inlines.hh
index d74cba2..95676fd 100644
--- a/src/checked_int.inlines.hh
+++ b/src/checked_int.inlines.hh
@@ -347,10 +347,10 @@ assign_signed_int_signed_int(To& to, const From from, Rounding_Dir dir) {
 	  && (Extended_Int<To_Policy, To>::min > Extended_Int<From_Policy, From>::min
 	      || Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max))) {
     if (CHECK_P(To_Policy::check_overflow,
-		from < From(Extended_Int<To_Policy, To>::min)))
+		PPL_LT_SILENT(from, From(Extended_Int<To_Policy, To>::min))))
       return set_neg_overflow_int<To_Policy>(to, dir);
     if (CHECK_P(To_Policy::check_overflow,
-		from > From(Extended_Int<To_Policy, To>::max)))
+		PPL_GT_SILENT(from, From(Extended_Int<To_Policy, To>::max))))
       return set_pos_overflow_int<To_Policy>(to, dir);
   }
   to = To(from);
@@ -390,7 +390,7 @@ assign_unsigned_int_unsigned_int(To& to, const From from, Rounding_Dir dir) {
       || (sizeof(To) == sizeof(From)
 	  && Extended_Int<To_Policy, To>::max < Extended_Int<From_Policy, From>::max)) {
     if (CHECK_P(To_Policy::check_overflow,
-		from > From(Extended_Int<To_Policy, To>::max)))
+		PPL_GT_SILENT(from, From(Extended_Int<To_Policy, To>::max))))
       return set_pos_overflow_int<To_Policy>(to, dir);
   }
   to = To(from);
@@ -561,9 +561,9 @@ assign_signed_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
     }
     if (from.fits_slong_p()) {
       signed long v = from.get_si();
-      if (v < Extended_Int<To_Policy, To>::min)
+      if (PPL_LT_SILENT(v, (Extended_Int<To_Policy, To>::min)))
 	return set_neg_overflow_int<To_Policy>(to, dir);
-      if (v > Extended_Int<To_Policy, To>::max)
+      if (PPL_GT_SILENT(v, (Extended_Int<To_Policy, To>::max)))
 	return set_pos_overflow_int<To_Policy>(to, dir);
       to = v;
       return V_EQ;
@@ -610,7 +610,7 @@ assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
     }
     if (from.fits_ulong_p()) {
       unsigned long v = from.get_ui();
-      if (v > Extended_Int<To_Policy, To>::max)
+      if (PPL_GT_SILENT(v, (Extended_Int<To_Policy, To>::max)))
 	return set_pos_overflow_int<To_Policy>(to, dir);
       to = v;
       return V_EQ;
@@ -1230,7 +1230,7 @@ mul_2exp_unsigned_int(Type& to, const Type x, unsigned int exp,
   if (x & (((Type(1) << exp) - 1) << (sizeof(Type) * CHAR_BIT - exp)))
     return set_pos_overflow_int<To_Policy>(to, dir);
   Type n = x << exp;
-  if (n > Extended_Int<To_Policy, Type>::max)
+  if (PPL_GT_SILENT(n, (Extended_Int<To_Policy, Type>::max)))
     return set_pos_overflow_int<To_Policy>(to, dir);
   to = n;
   return V_EQ;
@@ -1261,14 +1261,14 @@ mul_2exp_signed_int(Type& to, const Type x, unsigned int exp,
     if ((x & mask) != mask)
       return set_neg_overflow_int<To_Policy>(to, dir);
     n = x << exp;
-    if (n < Extended_Int<To_Policy, Type>::min)
+    if (PPL_LT_SILENT(n, (Extended_Int<To_Policy, Type>::min)))
       return set_neg_overflow_int<To_Policy>(to, dir);
   }
   else {
     if (x & mask)
       return set_pos_overflow_int<To_Policy>(to, dir);
     n = x << exp;
-    if (n > Extended_Int<To_Policy, Type>::max)
+    if (PPL_GT_SILENT(n, (Extended_Int<To_Policy, Type>::max)))
       return set_pos_overflow_int<To_Policy>(to, dir);
   }
   to = n;




More information about the PPL-devel mailing list