# HG changeset patch # User Rik # Date 1684380557 25200 # Node ID 28ef2991fb5a42721d2bc779f53b5a6de608b0ae # Parent f3d12359f0e40e7f4e1ea70fe23592b78deae35d Emit warning about infinite loop if for loop range starts with infinite value. * pt-eval.cc (execute_range_loop): Check base of range, in addition to limit of range, for infinite value and emit warning if found. * for.tst: Add tests for new behavior. Recode tests so that they don't emit warnings if file 'for.tst' is tested outside of test suite. diff -r f3d12359f0e4 -r 28ef2991fb5a libinterp/parse-tree/pt-eval.cc --- a/libinterp/parse-tree/pt-eval.cc Sat May 13 15:15:51 2023 +0200 +++ b/libinterp/parse-tree/pt-eval.cc Wed May 17 20:29:17 2023 -0700 @@ -3010,7 +3010,7 @@ { octave_idx_type steps = rng.numel (); - if (math::isinf (rng.limit ())) + if (math::isinf (rng.limit ()) || math::isinf (rng.base ())) warning_with_id ("Octave:infinite-loop", "FOR loop limit is infinite, will stop after %" OCTAVE_IDX_TYPE_FORMAT " steps", steps); diff -r f3d12359f0e4 -r 28ef2991fb5a test/for.tst --- a/test/for.tst Sat May 13 15:15:51 2023 +0200 +++ b/test/for.tst Wed May 17 20:29:17 2023 -0700 @@ -169,24 +169,51 @@ %! %! fail ("for i = 0:-1:-inf; break; end", "warning", %! "FOR loop limit is infinite"); +%! +%! fail ("for i = inf:-1:1; break; end", "warning", +%! "FOR loop limit is infinite"); +%! +%! fail ("for i = -inf:+1:1; break; end", "warning", +%! "FOR loop limit is infinite"); %!test <*45143> %! warning ("on", "Octave:infinite-loop", "local"); -%! k = 0; -%! for i = 1:Inf -%! if (++k > 10) -%! break; -%! endif -%! endfor -%! assert (i, 11); +% +%! code = cstrcat ("k = 0; ", +%! "for i = 1:Inf; ", +%! " if (++k > 10); ", +%! " break; ", +%! " endif; ", +%! "endfor; ", +%! "assert (i, 11); "); +%! fail (code, "warning", "FOR loop limit is infinite"); %! -%! k = 0; -%! for i = -1:-1:-Inf -%! if (++k > 10) -%! break; -%! endif -%! endfor -%! assert (i, -11); +%! code = cstrcat ("k = 0; ", +%! "for i = -1:-1:-Inf; ", +%! " if (++k > 10); ", +%! " break; ", +%! " endif; ", +%! "endfor; ", +%! "assert (i, -11); "); +%! fail (code, "warning", "FOR loop limit is infinite"); +%! +%! code = cstrcat ("k = 0; ", +%! "for i = Inf:-1:1; ", +%! " if (++k > 10); ", +%! " break; ", +%! " endif; ", +%! "endfor; ", +%! "assert (i, Inf); "); +%! fail (code, "warning", "FOR loop limit is infinite"); +%! +%! code = cstrcat ("k = 0; ", +%! "for i = -Inf:+1:1; ", +%! " if (++k > 10); ", +%! " break; ", +%! " endif; ", +%! "endfor; ", +%! "assert (i, -Inf); "); +%! fail (code, "warning", "FOR loop limit is infinite"); %! %! k = 0; %! for i = 1:-Inf