# HG changeset patch # User John W. Eaton # Date 1522703728 14400 # Node ID 56e888cd82983e48c60827bbc9e0d45deda4c8c1 # Parent 8f1ab6db670987643573e873feae0593eff0819f avoid cast warnings from GCC 8 (bug #53544) * typecast.cc (reinterpret_int_copy): New template function. (Ftypecast): Use it for int array casts. diff -r 8f1ab6db6709 -r 56e888cd8298 libinterp/corefcn/typecast.cc --- 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 +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 (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 (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 (data, byte_size, old_dims); + retval = reinterpret_int_copy (data, byte_size, old_dims); else if (numclass == "int16") - retval = reinterpret_copy (data, byte_size, old_dims); + retval = reinterpret_int_copy (data, byte_size, old_dims); else if (numclass == "int32") - retval = reinterpret_copy (data, byte_size, old_dims); + retval = reinterpret_int_copy (data, byte_size, old_dims); else if (numclass == "int64") - retval = reinterpret_copy (data, byte_size, old_dims); + retval = reinterpret_int_copy (data, byte_size, old_dims); } else if (numclass[0] == 'u') { if (numclass == "uint8") - retval = reinterpret_copy (data, byte_size, old_dims); + retval = reinterpret_int_copy (data, byte_size, old_dims); else if (numclass == "uint16") - retval = reinterpret_copy (data, byte_size, - old_dims); + retval = reinterpret_int_copy (data, byte_size, + old_dims); else if (numclass == "uint32") - retval = reinterpret_copy (data, byte_size, - old_dims); + retval = reinterpret_int_copy (data, byte_size, + old_dims); else if (numclass == "uint64") - retval = reinterpret_copy (data, byte_size, - old_dims); + retval = reinterpret_int_copy (data, byte_size, + old_dims); } else if (numclass == "single") retval = reinterpret_copy (data, byte_size, old_dims);