Remove "highbound" parameter from value_array
authorTom Tromey <tromey@adacore.com>
Tue, 29 Aug 2023 15:14:01 +0000 (09:14 -0600)
committerTom Tromey <tromey@adacore.com>
Tue, 29 Aug 2023 19:36:55 +0000 (13:36 -0600)
value_array requires the passed-in bounds to match the length of the
array_view it is given.  This patch removes the redundant "highbound"
parameter.

Reviewed-by: John Baldwin <jhb@FreeBSD.org>
Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/eval.c
gdb/rust-lang.c
gdb/valops.c
gdb/value.h

index 8dd1b530d06bcf5590f2eb01b894db18b3d52bd3..7c955a4e9eb366375f4b5c113bc60bdbee1d5929 100644 (file)
@@ -2515,7 +2515,7 @@ array_operation::evaluate (struct type *expect_type,
         objects.  */
       argvec[tem] = in_args[tem]->evaluate_with_coercion (exp, noside);
     }
-  return value_array (tem2, tem3, argvec);
+  return value_array (tem2, argvec);
 }
 
 value *
index f6e7d25f587210318b3b401f6ddf3a9db1b3442c..0e2ca090ba8c35e8f27c4f7f386f7300de957ca5 100644 (file)
@@ -1344,7 +1344,7 @@ eval_op_rust_array (struct type *expect_type, struct expression *exp,
 
       for (i = 0; i < copies; ++i)
        eltvec[i] = elt;
-      return value_array (0, copies - 1, eltvec);
+      return value_array (0, eltvec);
     }
   else
     {
index 1133049c54af6c2fe23ae2e6bd29c97da958da42..6404091d451d8435d3d73091160a421ebac99d73 100644 (file)
@@ -1684,18 +1684,16 @@ value_ind (struct value *arg1)
 /* Create a value for an array by allocating space in GDB, copying the
    data into that space, and then setting up an array value.
 
-   The array bounds are set from LOWBOUND and HIGHBOUND, and the array
-   is populated from the values passed in ELEMVEC.
+   The array bounds are set from LOWBOUND and the size of ELEMVEC, and
+   the array is populated from the values passed in ELEMVEC.
 
    The element type of the array is inherited from the type of the
    first element, and all elements must have the same size (though we
    don't currently enforce any restriction on their types).  */
 
 struct value *
-value_array (int lowbound, int highbound,
-            gdb::array_view<struct value *> elemvec)
+value_array (int lowbound, gdb::array_view<struct value *> elemvec)
 {
-  int nelem;
   int idx;
   ULONGEST typelength;
   struct value *val;
@@ -1704,28 +1702,23 @@ value_array (int lowbound, int highbound,
   /* Validate that the bounds are reasonable and that each of the
      elements have the same size.  */
 
-  nelem = highbound - lowbound + 1;
-  if (nelem <= 0)
-    {
-      error (_("bad array bounds (%d, %d)"), lowbound, highbound);
-    }
   typelength = type_length_units (elemvec[0]->enclosing_type ());
-  for (idx = 1; idx < nelem; idx++)
+  for (struct value *other : elemvec.slice (1))
     {
-      if (type_length_units (elemvec[idx]->enclosing_type ())
-         != typelength)
+      if (type_length_units (other->enclosing_type ()) != typelength)
        {
          error (_("array elements must all be the same size"));
        }
     }
 
   arraytype = lookup_array_range_type (elemvec[0]->enclosing_type (),
-                                      lowbound, highbound);
+                                      lowbound,
+                                      lowbound + elemvec.size () - 1);
 
   if (!current_language->c_style_arrays_p ())
     {
       val = value::allocate (arraytype);
-      for (idx = 0; idx < nelem; idx++)
+      for (idx = 0; idx < elemvec.size (); idx++)
        elemvec[idx]->contents_copy (val, idx * typelength, 0, typelength);
       return val;
     }
@@ -1734,7 +1727,7 @@ value_array (int lowbound, int highbound,
      copying in each element.  */
 
   val = value::allocate (arraytype);
-  for (idx = 0; idx < nelem; idx++)
+  for (idx = 0; idx < elemvec.size (); idx++)
     elemvec[idx]->contents_copy (val, idx * typelength, 0, typelength);
   return val;
 }
index ccf52199146ecf314414c93bde147d14036e0292..c28b731cc42f84560c6f15e4520eb7d0c59016a2 100644 (file)
@@ -1225,7 +1225,7 @@ inline struct value *value_string (const char *ptr, ssize_t count,
   return value_string ((const gdb_byte *) ptr, count, char_type);
 }
 
-extern struct value *value_array (int lowbound, int highbound,
+extern struct value *value_array (int lowbound,
                                  gdb::array_view<struct value *> elemvec);
 
 extern struct value *value_concat (struct value *arg1, struct value *arg2);