changeset 25088:56e888cd8298 stable

avoid cast warnings from GCC 8 (bug #53544) * typecast.cc (reinterpret_int_copy): New template function. (Ftypecast): Use it for int array casts.
author John W. Eaton <jwe@octave.org>
date Mon, 02 Apr 2018 17:15:28 -0400
parents 8f1ab6db6709
children 97fc8c87f4ce c1dab27c55af
files libinterp/corefcn/typecast.cc
diffstat 1 files changed, 30 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/typecast.cc	Mon Apr 02 11:31:11 2018 -0700
+++ b/libinterp/corefcn/typecast.cc	Mon Apr 02 17:15:28 2018 -0400
@@ -82,6 +82,25 @@
   return retval;
 }
 
+template <typename ArrayType>
+static ArrayType
+reinterpret_int_copy (const void *data, octave_idx_type byte_size,
+                      const dim_vector& old_dims)
+{
+  typedef typename ArrayType::element_type T;
+  typedef typename T::val_type VT;
+  octave_idx_type n = byte_size / sizeof (T);
+
+  if (n * static_cast<int> (sizeof (T)) != byte_size)
+    error ("typecast: incorrect number of input values to make output value");
+
+  ArrayType retval (get_vec_dims (old_dims, n));
+  VT *dest = reinterpret_cast<VT *> (retval.fortran_vec ());
+  std::memcpy (dest, data, n * sizeof (VT));
+
+  return retval;
+}
+
 DEFUN (typecast, args, ,
        doc: /* -*- texinfo -*-
 @deftypefn {} {@var{y} =} typecast (@var{x}, "@var{class}")
@@ -218,27 +237,27 @@
   else if (numclass[0] == 'i')
     {
       if (numclass == "int8")
-        retval = reinterpret_copy<int8NDArray> (data, byte_size, old_dims);
+        retval = reinterpret_int_copy<int8NDArray> (data, byte_size, old_dims);
       else if (numclass == "int16")
-        retval = reinterpret_copy<int16NDArray> (data, byte_size, old_dims);
+        retval = reinterpret_int_copy<int16NDArray> (data, byte_size, old_dims);
       else if (numclass == "int32")
-        retval = reinterpret_copy<int32NDArray> (data, byte_size, old_dims);
+        retval = reinterpret_int_copy<int32NDArray> (data, byte_size, old_dims);
       else if (numclass == "int64")
-        retval = reinterpret_copy<int64NDArray> (data, byte_size, old_dims);
+        retval = reinterpret_int_copy<int64NDArray> (data, byte_size, old_dims);
     }
   else if (numclass[0] == 'u')
     {
       if (numclass == "uint8")
-        retval = reinterpret_copy<uint8NDArray> (data, byte_size, old_dims);
+        retval = reinterpret_int_copy<uint8NDArray> (data, byte_size, old_dims);
       else if (numclass == "uint16")
-        retval = reinterpret_copy<uint16NDArray> (data, byte_size,
-                                                  old_dims);
+        retval = reinterpret_int_copy<uint16NDArray> (data, byte_size,
+                                                      old_dims);
       else if (numclass == "uint32")
-        retval = reinterpret_copy<uint32NDArray> (data, byte_size,
-                                                  old_dims);
+        retval = reinterpret_int_copy<uint32NDArray> (data, byte_size,
+                                                      old_dims);
       else if (numclass == "uint64")
-        retval = reinterpret_copy<uint64NDArray> (data, byte_size,
-                                                  old_dims);
+        retval = reinterpret_int_copy<uint64NDArray> (data, byte_size,
+                                                      old_dims);
     }
   else if (numclass == "single")
     retval = reinterpret_copy<FloatNDArray> (data, byte_size, old_dims);