Use value_true in value_equal and value_less
authorTom Tromey <tromey@adacore.com>
Wed, 1 Mar 2023 19:23:43 +0000 (12:23 -0700)
committerTom Tromey <tromey@adacore.com>
Mon, 27 Mar 2023 14:20:29 +0000 (08:20 -0600)
Both value_equal and value_less use value_as_long to check a
presumably boolean result of calling value_binop.  However,
value_binop in this case actually returns an int as wide as its
arguments, and this approach can then fail for integers wider than
LONGEST.  Instead, rewrite this in a form that works for any size
integer.

gdb/valarith.c

index b3321e4ff75dd3f0115df9b7a38e13e19aa44f58..25d72b7f38c579a56f2561e2c53c85884e0e73de 100644 (file)
@@ -1745,8 +1745,7 @@ value_equal (struct value *arg1, struct value *arg2)
   is_int2 = is_integral_type (type2);
 
   if (is_int1 && is_int2)
-    return longest_to_int (value_as_long (value_binop (arg1, arg2,
-                                                      BINOP_EQUAL)));
+    return value_true (value_binop (arg1, arg2, BINOP_EQUAL));
   else if ((is_floating_value (arg1) || is_int1)
           && (is_floating_value (arg2) || is_int2))
     {
@@ -1833,8 +1832,7 @@ value_less (struct value *arg1, struct value *arg2)
 
   if ((is_int1 && is_int2)
       || (is_fixed_point_type (type1) && is_fixed_point_type (type2)))
-    return longest_to_int (value_as_long (value_binop (arg1, arg2,
-                                                      BINOP_LESS)));
+    return value_true (value_binop (arg1, arg2, BINOP_LESS));
   else if ((is_floating_value (arg1) || is_int1)
           && (is_floating_value (arg2) || is_int2))
     {