comparison test/range.tst @ 30860:aaf689533e7b stable

Avoid integer division by zero for int64 ranges with double increment. * libinterp/octave-value/ov.cc (range_numel (T base, double increment, T limit)): Check for wrap around after casting to unsigned integer type. * test/range.tst: Un-comment tests.
author Markus Mützel <markus.muetzel@gmx.de>
date Tue, 22 Mar 2022 18:01:26 +0100
parents 82c1554c4a64
children 9b3b0dbb4eba
comparison
equal deleted inserted replaced
30858:fc3bd70cd1be 30860:aaf689533e7b
611 %!test # ascending ranges 611 %!test # ascending ranges
612 %! types = {"int8", "int16", "int32", "int64"}; 612 %! types = {"int8", "int16", "int32", "int64"};
613 %! for i_type = 1:numel (types) 613 %! for i_type = 1:numel (types)
614 %! assert (intmin (types{i_type}) : -double (intmin (types{i_type})) : intmax (types{i_type}), ... 614 %! assert (intmin (types{i_type}) : -double (intmin (types{i_type})) : intmax (types{i_type}), ...
615 %! [intmin(types{i_type}), 0]); 615 %! [intmin(types{i_type}), 0]);
616 %! ## FIXME: This test leads to a deadlock for "int64". 616 %! assert (intmin (types{i_type}) : -2*double (intmin (types{i_type})) : intmax (types{i_type}), ...
617 %! ## assert (intmin (types{i_type}) : -2*double (intmin (types{i_type})) : intmax (types{i_type}), ... 617 %! intmin (types{i_type}));
618 %! ## intmin (types{i_type}));
619 %! if (! strcmp (types, "int64")) 618 %! if (! strcmp (types, "int64"))
620 %! ## The increment cannot be represented in double precision for "int64" 619 %! ## The increment cannot be represented in double precision for "int64"
621 %! assert (intmin (types{i_type}) : 2*double (intmax (types{i_type})) : intmin (types{i_type}), ... 620 %! assert (intmin (types{i_type}) : 2*double (intmax (types{i_type})) : intmin (types{i_type}), ...
622 %! [intmin(types{i_type}), intmax(types{i_type})-1]); 621 %! [intmin(types{i_type}), intmax(types{i_type})-1]);
623 %! endif 622 %! endif
625 %!test # descending ranges 624 %!test # descending ranges
626 %! types = {"int8", "int16", "int32", "int64"}; 625 %! types = {"int8", "int16", "int32", "int64"};
627 %! for i_type = 1:numel (types) 626 %! for i_type = 1:numel (types)
628 %! assert (intmax (types{i_type}) : double (intmin (types{i_type})) : intmin (types{i_type}), ... 627 %! assert (intmax (types{i_type}) : double (intmin (types{i_type})) : intmin (types{i_type}), ...
629 %! [intmax(types{i_type}), -1]); 628 %! [intmax(types{i_type}), -1]);
630 %! ## FIXME: This test leads to a deadlock for "int64". 629 %! assert (intmax (types{i_type}) : 2*double (intmin (types{i_type})) : intmin (types{i_type}), ...
631 %! ## assert (intmax (types{i_type}) : 2*double (intmin (types{i_type})) : intmin (types{i_type}), ... 630 %! intmax (types{i_type}));
632 %! ## intmax (types{i_type}));
633 %! if (! strcmp (types, "int64")) 631 %! if (! strcmp (types, "int64"))
634 %! ## The increment cannot be represented in double precision for "int64" 632 %! ## The increment cannot be represented in double precision for "int64"
635 %! assert (intmax (types{i_type}) : -2*double (intmax (types{i_type})) : intmin (types{i_type}), ... 633 %! assert (intmax (types{i_type}) : -2*double (intmax (types{i_type})) : intmin (types{i_type}), ...
636 %! [intmax(types{i_type}), -intmax(types{i_type})]); 634 %! [intmax(types{i_type}), -intmax(types{i_type})]);
637 %! endif 635 %! endif