changeset 28590:5b1143d1d74b

improve compatibility of concatenation for large integer constants (bug #45945) * ov-magic-int.h: In value extractors, convert to double first, then return type. This makes the data type behave more like a the double precision scalar object. The as_TYPE functions still allow direct conversion of the internal integer value to another type. * integer.tst: New tests.
author John W. Eaton <jwe@octave.org>
date Tue, 21 Jul 2020 15:00:00 -0400
parents d5f9c8911090
children c83e0c850386
files libinterp/octave-value/ov-magic-int.h test/integer.tst
diffstat 2 files changed, 34 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-magic-int.h	Tue Jul 21 14:23:03 2020 -0400
+++ b/libinterp/octave-value/ov-magic-int.h	Tue Jul 21 15:00:00 2020 -0400
@@ -93,52 +93,52 @@
   bool isfloat (void) const { return true; }
 
   int8NDArray int8_array_value (void) const
-  { return int8NDArray (dim_vector (1, 1), scalar_ref ()); }
+  { return int8NDArray (dim_vector (1, 1), double_value ()); }
 
   int16NDArray int16_array_value (void) const
-  { return int16NDArray (dim_vector (1, 1), scalar_ref ()); }
+  { return int16NDArray (dim_vector (1, 1), double_value ()); }
 
   int32NDArray int32_array_value (void) const
-  { return int32NDArray (dim_vector (1, 1), scalar_ref ()); }
+  { return int32NDArray (dim_vector (1, 1), double_value ()); }
 
   int64NDArray int64_array_value (void) const
-  { return int64NDArray (dim_vector (1, 1), scalar_ref ()); }
+  { return int64NDArray (dim_vector (1, 1), double_value ()); }
 
   uint8NDArray uint8_array_value (void) const
-  { return uint8NDArray (dim_vector (1, 1), scalar_ref ()); }
+  { return uint8NDArray (dim_vector (1, 1), double_value ()); }
 
   uint16NDArray uint16_array_value (void) const
-  { return uint16NDArray (dim_vector (1, 1), scalar_ref ()); }
+  { return uint16NDArray (dim_vector (1, 1), double_value ()); }
 
   uint32NDArray uint32_array_value (void) const
-  { return uint32NDArray (dim_vector (1, 1), scalar_ref ()); }
+  { return uint32NDArray (dim_vector (1, 1), double_value ()); }
 
   uint64NDArray uint64_array_value (void) const
-  { return uint64NDArray (dim_vector (1, 1), scalar_ref ()); }
+  { return uint64NDArray (dim_vector (1, 1), double_value ()); }
 
   octave_int8 int8_scalar_value (void) const
-  { return octave_int8 (scalar_ref ()); }
+  { return octave_int8 (double_value ()); }
 
   octave_int16 int16_scalar_value (void) const
-  { return octave_int16 (scalar_ref ()); }
+  { return octave_int16 (double_value ()); }
 
   octave_int32 int32_scalar_value (void) const
-  { return octave_int32 (scalar_ref ()); }
+  { return octave_int32 (double_value ()); }
 
   octave_int64 int64_scalar_value (void) const
-  { return octave_int64 (scalar_ref ()); }
+  { return octave_int64 (double_value ()); }
 
   octave_uint8 uint8_scalar_value (void) const
-  { return octave_uint8 (scalar_ref ()); }
+  { return octave_uint8 (double_value ()); }
 
   octave_uint16 uint16_scalar_value (void) const
-  { return octave_uint16 (scalar_ref ()); }
+  { return octave_uint16 (double_value ()); }
 
   octave_uint32 uint32_scalar_value (void) const
-  { return octave_uint32 (scalar_ref ()); }
+  { return octave_uint32 (double_value ()); }
 
   octave_uint64 uint64_scalar_value (void) const
-  { return octave_uint64 (scalar_ref ()); }
+  { return octave_uint64 (double_value ()); }
 
   double double_value (bool = false) const
   {
@@ -146,10 +146,10 @@
   }
 
   float float_value (bool = false) const
-  { return scalar_ref ().float_value (); }
+  { return static_cast<float> (double_value ()); }
 
   double scalar_value (bool = false) const
-  { return scalar_ref ().double_value (); }
+  { return double_value (); }
 
   float float_scalar_value (bool = false) const
   { return float_value (); }
@@ -199,7 +199,7 @@
   char_array_value (bool = false) const
   {
     charNDArray retval (dim_vector (1, 1));
-    retval(0) = static_cast<char> (scalar_ref ().char_value ());
+    retval(0) = static_cast<char> (double_value ());
     return retval;
   }
 
@@ -208,7 +208,7 @@
     if (warn && scalar_ref () != T (0) && scalar_ref () != T (1))
       warn_logical_conversion ();
 
-    return scalar_ref ().bool_value ();
+    return double_value ();
   }
 
   boolNDArray bool_array_value (bool warn = false) const
@@ -216,7 +216,7 @@
     if (warn && scalar_ref () != T (0) && scalar_ref () != T (1))
       warn_logical_conversion ();
 
-    return boolNDArray (dim_vector (1, 1), scalar_ref ().bool_value ());
+    return boolNDArray (dim_vector (1, 1), double_value ());
   }
 
   octave_value as_double (void) const;
--- a/test/integer.tst	Tue Jul 21 14:23:03 2020 -0400
+++ b/test/integer.tst	Tue Jul 21 15:00:00 2020 -0400
@@ -145,3 +145,16 @@
 
 %!assert (int64 (9223372036854775807), intmax ("int64"))
 %!assert (int64 (-9223372036854775808), intmin ("int64"))
+
+%!test
+%! a = int64 ([9223372036854775803; 9223372036854775804; 9223372036854775805; 9223372036854775806; 9223372036854775807]);
+%! bval = int64 (9223372036854775807);
+%! b = [bval; bval; bval; bval; bval];
+%! assert (a, b);
+
+%!test
+%! a = int64 ([int64(9223372036854775803); 9223372036854775804; 9223372036854775805; 9223372036854775806; 9223372036854775807]);
+%! b0val = int64 (9223372036854775803);
+%! bval = int64 (9223372036854775807);
+%! b = [b0val; bval; bval; bval; bval];
+%! assert (a, b);