changeset 23571:b6144e6dda9e

allow bugs to be tagged as fixed in test suite * test.m: Recognize <*BUG-ID> as a fixed bug in tests. If they fail, count them separately as regressions. * __run_test_suite__.m: Report regressions separately.
author John W. Eaton <jwe@octave.org>
date Fri, 09 Jun 2017 15:34:03 -0400
parents 10248986f14c
children 0703d31e1ec0
files libinterp/corefcn/bsxfun.cc libinterp/corefcn/cellfun.cc libinterp/corefcn/conv2.cc libinterp/corefcn/data.cc libinterp/corefcn/dlmread.cc libinterp/corefcn/ellipj.cc libinterp/corefcn/error.cc libinterp/corefcn/file-io.cc libinterp/corefcn/graphics.cc libinterp/corefcn/hash.cc libinterp/corefcn/mappers.cc libinterp/corefcn/max.cc libinterp/corefcn/rand.cc libinterp/corefcn/regexp.cc libinterp/corefcn/svd.cc libinterp/dldfcn/chol.cc libinterp/dldfcn/symbfact.cc libinterp/octave-value/ov-cx-diag.cc libinterp/octave-value/ov-fcn-handle.cc libinterp/octave-value/ov-java.cc libinterp/parse-tree/pt-mat.cc scripts/general/accumarray.m scripts/general/bitset.m scripts/general/inputParser.m scripts/general/interp2.m scripts/general/interpft.m scripts/general/num2str.m scripts/general/postpad.m scripts/general/prepad.m scripts/general/rat.m scripts/geometry/rectint.m scripts/geometry/voronoi.m scripts/image/image.m scripts/image/imwrite.m scripts/io/importdata.m scripts/io/strread.m scripts/io/textread.m scripts/miscellaneous/orderfields.m scripts/optimization/qp.m scripts/plot/appearance/axis.m scripts/plot/appearance/grid.m scripts/plot/appearance/legend.m scripts/plot/appearance/title.m scripts/plot/draw/hist.m scripts/polynomial/residue.m scripts/set/setdiff.m scripts/signal/fftshift.m scripts/signal/ifftshift.m scripts/specfun/nthroot.m scripts/special-matrix/magic.m scripts/statistics/base/median.m scripts/statistics/base/quantile.m scripts/strings/base2dec.m scripts/strings/strcat.m scripts/strings/strmatch.m scripts/strings/strsplit.m scripts/testfun/__run_test_suite__.m scripts/testfun/test.m scripts/time/datestr.m scripts/time/datevec.m
diffstat 60 files changed, 383 insertions(+), 185 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/bsxfun.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/bsxfun.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -811,11 +811,14 @@
 %! endfor
 
 ## Automatic broadcasting with zero length dimensions
-%!assert <47085> ([1 2 3] .+ zeros (0, 3), zeros (0, 3))
-%!assert <47085> (rand (3, 3, 1) .+ rand (3, 3, 0), zeros (3, 3, 0))
+%!assert <*47085> ([1 2 3] .+ zeros (0, 3), zeros (0, 3))
+%!assert <*47085> ([1 2 3] .+ zeros (0, 3), zeros (0, 3))
+%!assert <*47085> (rand (3, 3, 1) .+ rand (3, 3, 0), zeros (3, 3, 0))
+%!assert <*47085> (rand (3, 3, 1) .+ rand (3, 3, 0), zeros (3, 3, 0))
 
 ## In-place broadcasting with zero length dimensions
-%!test <47085>
+%!test <*47085>
+%!test <*47085>
 %! a = zeros (0, 3);
 %! a .+= [1 2 3];
 %! assert (a, zeros (0, 3));
--- a/libinterp/corefcn/cellfun.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/cellfun.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -979,10 +979,14 @@
 %! assert (b, {"c", "g"});
 %! assert (c, {".d", ".h"});
 
-%!assert <40467> (cellfun (@isreal, {1 inf nan []}), [true, true, true, true])
-%!assert <40467> (cellfun (@isreal, {1 inf nan []}, "UniformOutput", false), {true, true, true, true})
-%!assert <40467> (cellfun (@iscomplex, {1 inf nan []}), [false, false, false, false])
-%!assert <40467> (cellfun (@iscomplex, {1 inf nan []}, "UniformOutput", false), {false, false, false, false})
+%!assert <*40467> (cellfun (@isreal, {1 inf nan []}), [true, true, true, true])
+%!assert <*40467> (cellfun (@isreal, {1 inf nan []}), [true, true, true, true])
+%!assert <*40467> (cellfun (@isreal, {1 inf nan []}, "UniformOutput", false), {true, true, true, true})
+%!assert <*40467> (cellfun (@isreal, {1 inf nan []}, "UniformOutput", false), {true, true, true, true})
+%!assert <*40467> (cellfun (@iscomplex, {1 inf nan []}), [false, false, false, false])
+%!assert <*40467> (cellfun (@iscomplex, {1 inf nan []}), [false, false, false, false])
+%!assert <*40467> (cellfun (@iscomplex, {1 inf nan []}, "UniformOutput", false), {false, false, false, false})
+%!assert <*40467> (cellfun (@iscomplex, {1 inf nan []}, "UniformOutput", false), {false, false, false, false})
 
 %!error cellfun (1)
 %!error cellfun ("isclass", 1)
--- a/libinterp/corefcn/conv2.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/conv2.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -255,13 +255,17 @@
 %!shared
 
 ## Test cases from Bug #34893
-%!assert <34893> (conv2 ([1:5;1:5], [1:2], "same"),
+%!assert <*34893> (conv2 ([1:5;1:5], [1:2], "same"),
+%!assert <*34893> (conv2 ([1:5;1:5], [1:2], "same"),
 %!                [4 7 10 13 10; 4 7 10 13 10])
-%!assert <34893> (conv2 ([1:5;1:5]', [1:2]', "same"),
+%!assert <*34893> (conv2 ([1:5;1:5]', [1:2]', "same"),
+%!assert <*34893> (conv2 ([1:5;1:5]', [1:2]', "same"),
 %!                [4 7 10 13 10; 4 7 10 13 10]')
-%!assert <34893> (conv2 ([1:5;1:5], [1:2], "valid"),
+%!assert <*34893> (conv2 ([1:5;1:5], [1:2], "valid"),
+%!assert <*34893> (conv2 ([1:5;1:5], [1:2], "valid"),
 %!                [4 7 10 13; 4 7 10 13])
-%!assert <34893> (conv2 ([1:5;1:5]', [1:2]', "valid"),
+%!assert <*34893> (conv2 ([1:5;1:5]', [1:2]', "valid"),
+%!assert <*34893> (conv2 ([1:5;1:5]', [1:2]', "valid"),
 %!                [4 7 10 13; 4 7 10 13]')
 
 %!test
--- a/libinterp/corefcn/data.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/data.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -559,7 +559,8 @@
 %! assert (f, complex (zeros (3, 2), [0,-0.5; 0.5,-0.5; Inf,-Inf]));
 %! assert (e(1:2,:), [0,1; 2,3]);
 
-%!assert <42583> (all (log2 (pow2 (-1074:1023)) == -1074:1023))
+%!assert <*42583> (all (log2 (pow2 (-1074:1023)) == -1074:1023))
+%!assert <*42583> (all (log2 (pow2 (-1074:1023)) == -1074:1023))
 */
 
 DEFUN (rem, args, ,
@@ -725,10 +726,13 @@
 %! assert (nnz (y), 1);
 %! assert (y, sparse ([NaN 0 0 0]));
 
-%!assert <45587> (signbit (rem (-0, 1)))
-%!assert <45587> (! signbit (rem (0, 1)))
-
-%!assert <42627> (rem (0.94, 0.01), 0.0)
+%!assert <*45587> (signbit (rem (-0, 1)))
+%!assert <*45587> (signbit (rem (-0, 1)))
+%!assert <*45587> (! signbit (rem (0, 1)))
+%!assert <*45587> (! signbit (rem (0, 1)))
+
+%!assert <*42627> (rem (0.94, 0.01), 0.0)
+%!assert <*42627> (rem (0.94, 0.01), 0.0)
 
 %!error rem (uint (8), int8 (5))
 %!error rem (uint8 ([1, 2]), uint8 ([3, 4, 5]))
@@ -904,10 +908,13 @@
 %!assert (mod (2.1, 0.1), 0)
 %!assert (mod (2.1, 0.2), 0.1, eps)
 
-%!assert <45587> (signbit (mod (-0, 0)))
-%!assert <45587> (! signbit (mod (0, -0)))
-
-%!assert <42627> (mod (0.94, 0.01), 0.0)
+%!assert <*45587> (signbit (mod (-0, 0)))
+%!assert <*45587> (signbit (mod (-0, 0)))
+%!assert <*45587> (! signbit (mod (0, -0)))
+%!assert <*45587> (! signbit (mod (0, -0)))
+
+%!assert <*42627> (mod (0.94, 0.01), 0.0)
+%!assert <*42627> (mod (0.94, 0.01), 0.0)
 */
 
 #define DATA_REDUCTION(FCN)                                             \
@@ -1266,9 +1273,12 @@
 %!assert (diag (int8 ([0, 1, 0, 0; 0, 0, 2, 0; 0, 0, 0, 3; 0, 0, 0, 0]), 1), int8 ([1; 2; 3]))
 %!assert (diag (int8 ([0, 0, 0, 0; 1, 0, 0, 0; 0, 2, 0, 0; 0, 0, 3, 0]), -1), int8 ([1; 2; 3]))
 
-%!assert <37411> (diag (diag ([5, 2, 3])(:,1)), diag([5 0 0 ]))
-%!assert <37411> (diag (diag ([5, 2, 3])(:,1), 2),  [0 0 5 0 0; zeros(4, 5)])
-%!assert <37411> (diag (diag ([5, 2, 3])(:,1), -2), [[0 0 5 0 0]', zeros(5, 4)])
+%!assert <*37411> (diag (diag ([5, 2, 3])(:,1)), diag([5 0 0 ]))
+%!assert <*37411> (diag (diag ([5, 2, 3])(:,1)), diag([5 0 0 ]))
+%!assert <*37411> (diag (diag ([5, 2, 3])(:,1), 2),  [0 0 5 0 0; zeros(4, 5)])
+%!assert <*37411> (diag (diag ([5, 2, 3])(:,1), 2),  [0 0 5 0 0; zeros(4, 5)])
+%!assert <*37411> (diag (diag ([5, 2, 3])(:,1), -2), [[0 0 5 0 0]', zeros(5, 4)])
+%!assert <*37411> (diag (diag ([5, 2, 3])(:,1), -2), [[0 0 5 0 0]', zeros(5, 4)])
 
 ## Test non-square size
 %!assert (diag ([1,2,3], 6, 3), [1 0 0; 0 2 0; 0 0 3; 0 0 0; 0 0 0; 0 0 0])
@@ -2202,7 +2212,8 @@
 
 %!error horzcat (struct ("foo", "bar"), cell (1))
 
-%!test <39041> assert (class (horzcat (cell(0), struct())), "cell")
+%!test <*39041> assert (class (horzcat (cell(0), struct())), "cell")
+%!test <*39041> assert (class (horzcat (cell(0), struct())), "cell")
 %!test <51086> assert (class (horzcat (struct(), cell(0))), "struct")
 */
 
@@ -2426,7 +2437,8 @@
 %!assert ([zeros(3,2,2); ones(1,2,2)], repmat ([0;0;0;1],[1,2,2]))
 %!assert ([zeros(3,2,2); ones(1,2,2)], vertcat (zeros (3,2,2), ones (1,2,2)))
 
-%!test <49759>
+%!test <*49759>
+%!test <*49759>
 %! A = [];
 %! B = {1; 2};
 %! assert (cat (1, A, B), {1; 2});
@@ -4228,7 +4240,8 @@
 ## Matlab requires the size to be a row vector.  In that logic, it supports
 ## n to be a 1x0 vector (returns 0x0) but not a 0x1 vector.  Octave supports
 ## any vector and therefore must support 0x1, 1x0, and 0x0x1 (but not 0x1x1).
-%!test <47298>
+%!test <*47298>
+%!test <*47298>
 %! funcs = {@zeros, @ones, @inf, @nan, @NA, @i, @pi, @e};
 %! for idx = 1:numel (funcs)
 %!   func = funcs{idx};
--- a/libinterp/corefcn/dlmread.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/dlmread.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -551,7 +551,8 @@
 %!   unlink (file);
 %! end_unwind_protect
 
-%!test <42025>
+%!test <*42025>
+%!test <*42025>
 %! file = tempname ();
 %! unwind_protect
 %!   fid = fopen (file, "wt");
@@ -567,7 +568,8 @@
 %!   unlink (file);
 %! end_unwind_protect
 
-%!test <50589>
+%!test <*50589>
+%!test <*50589>
 %! file = tempname ();
 %! unwind_protect
 %!   fid = fopen (file, "wt");
--- a/libinterp/corefcn/ellipj.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/ellipj.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -816,7 +816,8 @@
 %! assert (cn, C, 8*eps);
 %! assert (dn, D, 8*eps);
 
-%!test <43344>
+%!test <*43344>
+%!test <*43344>
 %! ## Test continuity of dn when cn is near zero
 %! m = 0.5;
 %! u = ellipke (0.5);
--- a/libinterp/corefcn/error.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/error.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -1751,7 +1751,8 @@
 }
 
 /*
-%!test <45753>
+%!test <*45753>
+%!test <*45753>
 %! warning ("error");
 %! assert (! isempty (help ("warning")));
 */
--- a/libinterp/corefcn/file-io.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/file-io.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -1761,13 +1761,15 @@
 %! assert (R{1}, int32 (1));
 %! assert (isempty (R{2}), true);
 
-%!test <37023>
+%!test <*37023>
+%!test <*37023>
 %! data = textscan ("   1. 1 \n 2 3\n", '%f %f');
 %! assert (data{1}, [1; 2], 1e-15);
 %! assert (data{2}, [1; 3], 1e-15);
 
 ## Whitespace test using delimiter ";"
-%!test <37333>
+%!test <*37333>
+%!test <*37333>
 %! tc{1, 1} = "C:/code;";
 %! tc{1, end+1} = "C:/code/meas;";
 %! tc{1, end+1} = " C:/code/sim;";
@@ -1783,7 +1785,8 @@
 %! endfor
 
 ## Whitespace test, adding multipleDelimsAsOne true arg
-%!test <37333>
+%!test <*37333>
+%!test <*37333>
 %! tc{1, 1} = "C:/code;";
 %! tc{1, end+1} = " C:/code/meas;";
 %! tc{1, end+1} = "C:/code/sim;;";
@@ -1799,7 +1802,8 @@
 %! endfor
 
 ## Whitespace test (bug #37333), adding multipleDelimsAsOne false arg
-%!test <37333>
+%!test <*37333>
+%!test <*37333>
 %! tc{1, 1} = "C:/code;";
 %! tc{1, end+1} = " C:/code/meas;";
 %! tc{1, end+1} = "C:/code/sim;;";
@@ -1816,7 +1820,8 @@
 %! endfor
 
 ## Whitespace test (bug #37333) whitespace "" arg
-%!test <37333>
+%!test <*37333>
+%!test <*37333>
 %! tc{1, 1} = "C:/code;";
 %! tc{1, end+1} = " C:/code/meas;";
 %! tc{1, end+1} = "C:/code/sim;";
@@ -1831,7 +1836,8 @@
 %! endfor
 
 ## Whitespace test (bug #37333), whitespace " " arg
-%!test <37333>
+%!test <*37333>
+%!test <*37333>
 %! tc{1, 1} = "C:/code;";
 %! tc{1, end+1} = " C:/code/meas;";
 %! tc{1, end+1} = "C:/code/sim;";
@@ -1949,19 +1955,23 @@
 %! unlink (f);
 %! assert (msg1, lasterr);
 
-%!assert <41824> (textscan ("123", "", "whitespace", " "){:}, 123);
+%!assert <*41824> (textscan ("123", "", "whitespace", " "){:}, 123);
+%!assert <*41824> (textscan ("123", "", "whitespace", " "){:}, 123);
 
 ## just test supplied emptyvalue
-%!assert <42343> (textscan (",NaN", "", "delimiter", "," ,"emptyValue" ,Inf),
+%!assert <*42343> (textscan (",NaN", "", "delimiter", "," ,"emptyValue" ,Inf),
+%!assert <*42343> (textscan (",NaN", "", "delimiter", "," ,"emptyValue" ,Inf),
 %!                {Inf, NaN})
 
 ## test padding with supplied emptyvalue
-%!test <42343>
+%!test <*42343>
+%!test <*42343>
 %! c = textscan (",1,,4\nInf,  ,NaN\n", "", "delimiter", ",",
 %!               "emptyvalue", -10);
 %! assert (cell2mat (c), [-10, 1, -10, 4; Inf, -10, NaN, -10]);
 
-%!test <42528>
+%!test <*42528>
+%!test <*42528>
 %! assert (textscan ("1i", ""){1},  0+1i);
 %! C = textscan ("3, 2-4i, NaN\n -i, 1, 23.4+2.2i\n 1+1 1+1j", "",
 %!               "delimiter", ",");
@@ -1992,7 +2002,8 @@
 %! assert (c{2}', [12, 22]);
 %! assert (c{3}', [13, 23]);
 
-%!test <44750>
+%!test <*44750>
+%!test <*44750>
 %! c = textscan ("/home/foo/", "%s", "delimiter", "/",
 %!               "MultipleDelimsAsOne", 1);
 %! assert (c{1}, {"home"; "foo"});
@@ -2014,7 +2025,8 @@
 %! assert (c{1}, 32.5, 1e-5);
 
 ## Test various forms of string format specifiers
-%!test <45712>
+%!test <*45712>
+%!test <*45712>
 %! str = "14 :1 z:2 z:3 z:5 z:11";
 %! C = textscan (str, "%f %s %*s %3s %*3s %f", "delimiter", ":");
 %! assert (C, {14, {"1 z"}, {"3 z"}, 11});
@@ -2103,7 +2115,8 @@
 %! assert (C{1}, {"ab cd efg"; "a ce g"; "   "});
 %! assert (C{2}, {"1Any"; "2Trailing"; "3Junk"});
 
-%!assert <36464> (textscan ("1 2 3 4 5 6", "%*n%n%*[^\n]"){1}, 2);
+%!assert <*36464> (textscan ("1 2 3 4 5 6", "%*n%n%*[^\n]"){1}, 2);
+%!assert <*36464> (textscan ("1 2 3 4 5 6", "%*n%n%*[^\n]"){1}, 2);
 
 ## test %[]] and %[^]]
 %!test
--- a/libinterp/corefcn/graphics.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/graphics.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -7230,7 +7230,8 @@
 }
 
 /*
-%!test <45356>
+%!test <*45356>
+%!test <*45356>
 %! hf = figure ("visible", "off");
 %! unwind_protect
 %!   plot (1:10);
--- a/libinterp/corefcn/hash.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/hash.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -199,18 +199,26 @@
 %!         "417a81a538327af927da3e"]);
 
 ## Test special character behavior
-%!assert <31689> (hash ("md2", "abc\0"), "5a636d615002a7874ac1c9e9a43361f7")
-%!assert <31689> (hash ("md4", "abc\0"), "0ee5201897ecb206c4eaba1d2da5224d")
-%!assert <31689> (hash ("md5", "abc\0"), "147a664a2ca9410911e61986d3f0d52a")
-%!assert <31689> (hash ("sha1", "abc\0"), "686483805ac47ca14e03514f7481a7973b401762")
-%!assert <31689> (hash ("sha224", "abc\0"),
+%!assert <*31689> (hash ("md2", "abc\0"), "5a636d615002a7874ac1c9e9a43361f7")
+%!assert <*31689> (hash ("md2", "abc\0"), "5a636d615002a7874ac1c9e9a43361f7")
+%!assert <*31689> (hash ("md4", "abc\0"), "0ee5201897ecb206c4eaba1d2da5224d")
+%!assert <*31689> (hash ("md4", "abc\0"), "0ee5201897ecb206c4eaba1d2da5224d")
+%!assert <*31689> (hash ("md5", "abc\0"), "147a664a2ca9410911e61986d3f0d52a")
+%!assert <*31689> (hash ("md5", "abc\0"), "147a664a2ca9410911e61986d3f0d52a")
+%!assert <*31689> (hash ("sha1", "abc\0"), "686483805ac47ca14e03514f7481a7973b401762")
+%!assert <*31689> (hash ("sha1", "abc\0"), "686483805ac47ca14e03514f7481a7973b401762")
+%!assert <*31689> (hash ("sha224", "abc\0"),
+%!assert <*31689> (hash ("sha224", "abc\0"),
 %!        "fbc8e47920e108bb1d0b631d18b36ae9b1549d28362aa15ebe960cfb");
-%!assert <31689> (hash ("sha256", "abc\0"),
+%!assert <*31689> (hash ("sha256", "abc\0"),
+%!assert <*31689> (hash ("sha256", "abc\0"),
 %!        "dc1114cd074914bd872cc1f9a23ec910ea2203bc79779ab2e17da25782a624fc");
-%!assert <31689> (hash ("sha384", "abc\0"),
+%!assert <*31689> (hash ("sha384", "abc\0"),
+%!assert <*31689> (hash ("sha384", "abc\0"),
 %!        ["eba81f2dfba4ec60d3f786c89d91b08e6c0b63d55986874378e385", ...
 %!         "e6fac587cce7a520ca9437290fe626cbf75c855e17"]);
-%!assert <31689> (hash ("sha512", "abc\0"),
+%!assert <*31689> (hash ("sha512", "abc\0"),
+%!assert <*31689> (hash ("sha512", "abc\0"),
 %!        ["7ce05eda233e545a2d5c626862a5ddaafb09b9d8ec3bec08aa458b", ...
 %!         "7c9e7d939d84a57d5a20d8a9002983aabae2457b19c50ba326bf5b", ...
 %!         "081f75b41342f42c3383"]);
--- a/libinterp/corefcn/mappers.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/mappers.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -374,7 +374,8 @@
 %! assert (atan (x), v, sqrt (eps ("single")));
 
 ## Test large magnitude arguments (bug #44310, bug #45507)
-%!test <44310>
+%!test <*44310>
+%!test <*44310>
 %! x = [1, -1, i, -i] .* 1e150;
 %! v = [pi/2, -pi/2, pi/2, -pi/2];
 %! assert (real (atan (x)), v);
@@ -409,7 +410,8 @@
 %! assert (atanh (x), v, sqrt (eps ("single")));
 
 ## Test large magnitude arguments (bug #44310, bug #45507)
-%!test <44310>
+%!test <*44310>
+%!test <*44310>
 %! x = [1, -1, i, -i] .* 1e150;
 %! v = [pi/2, pi/2, pi/2, -pi/2];
 %! assert (imag (atanh (x)), v);
--- a/libinterp/corefcn/max.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/max.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -865,8 +865,10 @@
 %! assert (max (x, 2.1i), sparse ([2.1i 2.1i 3 4]));
 
 ## Test for bug #40743
-%!assert <40743> (max (zeros (1,0), ones (1,1)), zeros (1,0))
-%!assert <40743> (max (sparse (zeros (1,0)), sparse (ones (1,1))),
+%!assert <*40743> (max (zeros (1,0), ones (1,1)), zeros (1,0))
+%!assert <*40743> (max (zeros (1,0), ones (1,1)), zeros (1,0))
+%!assert <*40743> (max (sparse (zeros (1,0)), sparse (ones (1,1))),
+%!assert <*40743> (max (sparse (zeros (1,0)), sparse (ones (1,1))),
 %!                sparse (zeros (1,0)))
 
 %!error max ()
--- a/libinterp/corefcn/rand.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/rand.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -1166,7 +1166,8 @@
 %!assert (length (randperm (20,10)), 10)
 
 ## Test biggish N
-%!assert <39378> (length (randperm (30000^2, 100000)), 100000)
+%!assert <*39378> (length (randperm (30000^2, 100000)), 100000)
+%!assert <*39378> (length (randperm (30000^2, 100000)), 100000)
 
 %!test
 %! rand ("seed", 0);
--- a/libinterp/corefcn/regexp.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/regexp.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -980,7 +980,8 @@
 %! ## Parenthesis in named token (ie (int)) causes a problem
 %! assert (regexp ('qwe int asd', ['(?<typestr>(int))'], 'names'), struct ('typestr', 'int'));
 
-%!test <35683>
+%!test <*35683>
+%!test <*35683>
 %! ## Mix of named and unnamed tokens can cause segfault
 %! str = "abcde";
 %! ptn = '(?<T1>a)(\w+)(?<T2>d\w+)';
@@ -1117,7 +1118,8 @@
 %!assert (regexp ("\n", "\n"), 1)
 
 # Test escape sequences are silently converted
-%!test <45407>
+%!test <*45407>
+%!test <*45407>
 %! assert (regexprep ('s', 's', 'x\.y'), 'x.y');
 %! assert (regexprep ('s', '(s)', 'x\$1y'), 'x$1y');
 %! assert (regexprep ('s', '(s)', 'x\\$1y'), 'x\sy');
--- a/libinterp/corefcn/svd.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/corefcn/svd.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -352,7 +352,8 @@
 %! assert (size (s), [0, 0]);
 %! assert (size (v), [0, 0]);
 
-%!test <49309>
+%!test <*49309>
+%!test <*49309>
 %! [~,~,v] = svd ([1, 1, 1], 0);
 %! assert (size (v), [3 3]);
 %! [~,~,v] = svd ([1, 1, 1], "econ");
--- a/libinterp/dldfcn/chol.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/dldfcn/chol.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -339,7 +339,8 @@
 %! assert (pd, pv)
 %! assert (qv, [1 2])
 
-%!testif HAVE_CHOLMOD <42587>
+%!testif HAVE_CHOLMOD <*42587>
+%!testif HAVE_CHOLMOD <*42587>
 %! A = sparse ([1 0 8;0 1 8;8 8 1]);
 %! [Q, p] = chol (A);
 %! assert (p != 0);
--- a/libinterp/dldfcn/symbfact.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/dldfcn/symbfact.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -406,7 +406,8 @@
 %! [~, ~, ~, ~, l] = symbfact (A, "sym", "lower");
 %! assert (l, sparse (tril (true (3))));
 
-%!testif HAVE_CHOLMOD <42587>
+%!testif HAVE_CHOLMOD <*42587>
+%!testif HAVE_CHOLMOD <*42587>
 %! ## singular matrix
 %! A = sparse ([1 0 8;0 1 8;8 8 1]);
 %! [count, h, parent, post, r] = symbfact (A);
--- a/libinterp/octave-value/ov-cx-diag.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/octave-value/ov-cx-diag.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -252,5 +252,6 @@
 }
 
 /*
-%!assert <36368> (diag ([1+i, 1-i])^2 , diag ([2i, -2i]), 4*eps)
+%!assert <*36368> (diag ([1+i, 1-i])^2 , diag ([2i, -2i]), 4*eps)
+%!assert <*36368> (diag ([1+i, 1-i])^2 , diag ([2i, -2i]), 4*eps)
 */
--- a/libinterp/octave-value/ov-fcn-handle.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/octave-value/ov-fcn-handle.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -1294,7 +1294,8 @@
 }
 
 /*
-%!test <33857>
+%!test <*33857>
+%!test <*33857>
 %! a = 2;
 %! f = @(x) a + x;
 %! g = @(x) 2 * x;
@@ -1346,7 +1347,8 @@
 %!  endif
 %!endfunction
 
-%!test <35876>
+%!test <*35876>
+%!test <*35876>
 %! a = 2;
 %! f = @(x) a + x;
 %! g = @(x) 2 * x;
--- a/libinterp/octave-value/ov-java.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/octave-value/ov-java.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -3223,7 +3223,8 @@
 %! assert (javaMethod ("binarySearch", "java.util.Arrays", uint16 ([90 100 128]), uint16 (128)), 2);
 
 ## Check we can create objects that wrap java literals
-%!testif HAVE_JAVA; usejava ("jvm") <38821>
+%!testif HAVE_JAVA; usejava ("jvm") <*38821>
+%!testif HAVE_JAVA; usejava ("jvm") <*38821>
 %! assert (class (javaObject ("java.lang.Byte",     uint8 (1))), "java.lang.Byte");
 %! assert (class (javaObject ("java.lang.Byte",      int8 (1))), "java.lang.Byte");
 %! assert (class (javaObject ("java.lang.Short",   uint16 (1))), "java.lang.Short");
@@ -3234,7 +3235,8 @@
 %! assert (class (javaObject ("java.lang.Long",     int64 (1))), "java.lang.Long");
 
 ## Test for automatic conversion of specific numeric classes
-%!testif HAVE_JAVA; usejava ("jvm") <48013>
+%!testif HAVE_JAVA; usejava ("jvm") <*48013>
+%!testif HAVE_JAVA; usejava ("jvm") <*48013>
 %! assert (javaMethod ("valueOf", "java.lang.Byte",     int8 (1)), 1)
 %! assert (javaMethod ("valueOf", "java.lang.Short",   int16 (1)), 1)
 %! assert (javaMethod ("valueOf", "java.lang.Integer", int32 (1)), 1)
@@ -3245,7 +3247,8 @@
 %! assert (class (javaMethod ("valueOf", "java.math.BigInteger",  int64 (1))), "java.math.BigInteger")
 
 ## Automatic conversion from string cell array into String[]
-%!testif HAVE_JAVA; usejava ("jvm") <45290>
+%!testif HAVE_JAVA; usejava ("jvm") <*45290>
+%!testif HAVE_JAVA; usejava ("jvm") <*45290>
 %! assert (javaMethod ("binarySearch", "java.util.Arrays", {"aaa", "bbb", "ccc", "zzz"}, "aaa"), 0);
 %! assert (javaMethod ("binarySearch", "java.util.Arrays", {"aaa", "bbb", "ccc", "zzz"}, "zzz"), 3);
 %! assert (javaMethod ("binarySearch", "java.util.Arrays", {"aaa", "bbb", "ccc", "zzz"}, "hhh") < 0);
--- a/libinterp/parse-tree/pt-mat.cc	Fri Jun 09 14:06:41 2017 -0400
+++ b/libinterp/parse-tree/pt-mat.cc	Fri Jun 09 15:34:03 2017 -0400
@@ -343,7 +343,8 @@
 %!assert (class ([cell(1), struct("foo", "bar")]), "cell")
 %!error [struct("foo", "bar"), cell(1)]
 
-%!test <39041> assert (class ([cell(0), struct()]), "cell")
+%!test <*39041> assert (class ([cell(0), struct()]), "cell")
+%!test <*39041> assert (class ([cell(0), struct()]), "cell")
 %!test <51086> assert (class ([struct(), cell(0)]), "struct")
 
 %!assert ([,1], 1)
--- a/scripts/general/accumarray.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/general/accumarray.m	Fri Jun 09 15:34:03 2017 -0400
@@ -440,7 +440,8 @@
 %!error (accumarray ([1,2,3],1:2))
 
 ## Handle empty arrays
-%!test <47287>
+%!test <*47287>
+%!test <*47287>
 %! ## min, max, and sum are special cases within accumarray so test them.
 %! funcs = {@(x) length (x) > 1, @min, @max, @sum};
 %! for idx = 1:numel (funcs)
--- a/scripts/general/bitset.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/general/bitset.m	Fri Jun 09 15:34:03 2017 -0400
@@ -101,7 +101,8 @@
 %!   endfor
 %! endfor
 
-%!assert <36458> (bitset (uint8 ([1, 2;3 4]), 1, [0 1; 0 1]),
+%!assert <*36458> (bitset (uint8 ([1, 2;3 4]), 1, [0 1; 0 1]),
+%!assert <*36458> (bitset (uint8 ([1, 2;3 4]), 1, [0 1; 0 1]),
 %!                uint8 ([0, 3; 2 5]))
 
 %!error bitset (1)
--- a/scripts/general/inputParser.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/general/inputParser.m	Fri Jun 09 15:34:03 2017 -0400
@@ -658,7 +658,8 @@
 %!         {"file", "foo", 80,    true,      "circle"});
 
 ## We must not perform validation of default values
-%!test <45837>
+%!test <*45837>
+%!test <*45837>
 %! p = inputParser;
 %! p.addParameter ("Dir", [], @ischar);
 %! p.parse ();
@@ -744,7 +745,8 @@
 ## This behaviour means that a positional option can never be a string
 ## that is the name of a parameter key.  This is required for Matlab
 ## compatibility.
-%!test <50752>
+%!test <*50752>
+%!test <*50752>
 %! p = inputParser ();
 %! p.addOptional ("op1", "val");
 %! p.addParameter ("line", "tree");
@@ -784,7 +786,8 @@
 %! fail ('p.parse ("line", "line", 89)',
 %!       "non-string for Parameter name or Switch")
 
-%!test <50752>
+%!test <*50752>
+%!test <*50752>
 %! ## This fails in Matlab but works in Octave.  It is a bug there
 %! ## that we do not replicate.
 %! p = inputParser ();
@@ -793,7 +796,8 @@
 %! p.parse ("line");
 %! assert (p.Results, struct ("op1", "line", "line", "circle"))
 
-%!test <50752>
+%!test <*50752>
+%!test <*50752>
 %! p = inputParser;
 %! p.addOptional ("op1", "val1");
 %! p.addSwitch ("line");
--- a/scripts/general/interp2.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/general/interp2.m	Fri Jun 09 15:34:03 2017 -0400
@@ -519,11 +519,14 @@
 %! assert (interp2 (X, 2.5, 2.5, "nearest"), 3);
 
 ## re-order monotonically decreasing
-%!assert <41838> (interp2 ([1 2 3], [3 2 1], magic (3), 2.5, 3), 3.5)
-%!assert <41838> (interp2 ([3 2 1], [1 2 3], magic (3), 1.5, 1), 3.5)
+%!assert <*41838> (interp2 ([1 2 3], [3 2 1], magic (3), 2.5, 3), 3.5)
+%!assert <*41838> (interp2 ([1 2 3], [3 2 1], magic (3), 2.5, 3), 3.5)
+%!assert <*41838> (interp2 ([3 2 1], [1 2 3], magic (3), 1.5, 1), 3.5)
+%!assert <*41838> (interp2 ([3 2 1], [1 2 3], magic (3), 1.5, 1), 3.5)
 
 ## Linear interpretation with vector XI doesn't lead to matrix output
-%!assert <49506> (interp2 ([2 3], [2 3 4], [1 2; 3 4; 5 6], [2 3], 3, "linear"), [3 4])
+%!assert <*49506> (interp2 ([2 3], [2 3 4], [1 2; 3 4; 5 6], [2 3], 3, "linear"), [3 4])
+%!assert <*49506> (interp2 ([2 3], [2 3 4], [1 2; 3 4; 5 6], [2 3], 3, "linear"), [3 4])
 
 %!shared z, zout, tol
 %! z = [1 3 5; 3 5 7; 5 7 9];
--- a/scripts/general/interpft.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/general/interpft.m	Fri Jun 09 15:34:03 2017 -0400
@@ -123,7 +123,8 @@
 %!assert (interpft ([y,y],n), [y,y], 20*eps)
 
 ## Test case with complex input
-%!test <39566>
+%!test <*39566>
+%!test <*39566>
 %! x = (1 + j) * [1:4]';
 %! y = ifft ([15 + 15*j; -6; -1.5 - 1.5*j; 0; -1.5 - 1.5*j; -6*j]);
 %! assert (interpft (x, 6), y, 10*eps);
--- a/scripts/general/num2str.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/general/num2str.m	Fri Jun 09 15:34:03 2017 -0400
@@ -247,9 +247,11 @@
 %! assert (num2str (1e23), "100000000000000000000000");
 
 ## Test for extra rows generated from newlines in format
-%!assert <44864> (rows (num2str (magic (3), "%3d %3d %3d\n")), 3)
+%!assert <*44864> (rows (num2str (magic (3), "%3d %3d %3d\n")), 3)
+%!assert <*44864> (rows (num2str (magic (3), "%3d %3d %3d\n")), 3)
 
-%!assert <45174> (num2str ([65 66 67], "%s"), "ABC")
+%!assert <*45174> (num2str ([65 66 67], "%s"), "ABC")
+%!assert <*45174> (num2str ([65 66 67], "%s"), "ABC")
 
 %!error num2str ()
 %!error num2str (1, 2, 3)
--- a/scripts/general/postpad.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/general/postpad.m	Fri Jun 09 15:34:03 2017 -0400
@@ -106,7 +106,8 @@
 %!assert (postpad ([1; 2], 2, 3, 2), [1 3; 2 3])
 
 %! ## Test with string concatenation
-%!assert <44162> (postpad ("Octave", 16, "x"), "Octavexxxxxxxxxx")
+%!assert <*44162> (postpad ("Octave", 16, "x"), "Octavexxxxxxxxxx")
+%!assert <*44162> (postpad ("Octave", 16, "x"), "Octavexxxxxxxxxx")
 %!assert (postpad ("Octave", 4), "Octa")
 
 %!error postpad ()
--- a/scripts/general/prepad.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/general/prepad.m	Fri Jun 09 15:34:03 2017 -0400
@@ -109,7 +109,8 @@
 %!assert (prepad ([1;2], 2, 2, 3), reshape ([2;2;1;2], 2, 1, 2))
 
 %! ## Test with string concatenation
-%!assert <44162> (prepad ("Octave", 16, "x"), "xxxxxxxxxxOctave")
+%!assert <*44162> (prepad ("Octave", 16, "x"), "xxxxxxxxxxOctave")
+%!assert <*44162> (prepad ("Octave", 16, "x"), "xxxxxxxxxxOctave")
 %!assert (prepad ("Octave", 4), "tave")
 
 ## FIXME: We need tests for multidimensional arrays.
--- a/scripts/general/rat.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/general/rat.m	Fri Jun 09 15:34:03 2017 -0400
@@ -159,7 +159,8 @@
 %! assert (n, [1, 3, 1]);
 %! assert (d, [2, 10, 3]);
 
-%!assert <43374> (eval (rat (0.75)), [0.75])
+%!assert <*43374> (eval (rat (0.75)), [0.75])
+%!assert <*43374> (eval (rat (0.75)), [0.75])
 
 %!error rat ()
 %!error rat (1, 2, 3)
--- a/scripts/geometry/rectint.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/geometry/rectint.m	Fri Jun 09 15:34:03 2017 -0400
@@ -94,10 +94,14 @@
 %!assert (rectint ([0 0 1 1;0.5 0.5 1 1;-1 -1 2 2], [1 1 2 2]), [0;0.25;0])
 %!assert (rectint ([1 1 2 2], [0 0 1 1;0.5 0.5 1 1;-1 -1 2 2]), [0 0.25 0])
 
-%!assert <44904> (rectint ([0 0 5 5], [6 6 5 5]), 0)
-%!assert <44904> (rectint ([0 0 5 5], [0 6 5 5]), 0)
-%!assert <44904> (rectint ([0 0 5 5], [6 0 5 5]), 0)
-%!assert <44904> (rectint ([0 0 0 5 5 5], [0 0 6 5 5 5]), 0)
+%!assert <*44904> (rectint ([0 0 5 5], [6 6 5 5]), 0)
+%!assert <*44904> (rectint ([0 0 5 5], [6 6 5 5]), 0)
+%!assert <*44904> (rectint ([0 0 5 5], [0 6 5 5]), 0)
+%!assert <*44904> (rectint ([0 0 5 5], [0 6 5 5]), 0)
+%!assert <*44904> (rectint ([0 0 5 5], [6 0 5 5]), 0)
+%!assert <*44904> (rectint ([0 0 5 5], [6 0 5 5]), 0)
+%!assert <*44904> (rectint ([0 0 0 5 5 5], [0 0 6 5 5 5]), 0)
+%!assert <*44904> (rectint ([0 0 0 5 5 5], [0 0 6 5 5 5]), 0)
 
 ## Test volumes
 %!shared r1, r2, r3, r4, r5
--- a/scripts/geometry/voronoi.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/geometry/voronoi.m	Fri Jun 09 15:34:03 2017 -0400
@@ -200,19 +200,22 @@
 %! assert (vx(2,:), zeros (1, columns (vx)), eps);
 %! assert (vy(2,:), zeros (1, columns (vy)), eps);
 
-%!testif HAVE_QHULL <40996>
+%!testif HAVE_QHULL <*40996>
+%!testif HAVE_QHULL <*40996>
 %! ## Special case of just 2 points
 %! x = [0 1];  y = [1 0];
 %! [vx, vy] = voronoi (x,y);
 %! assert (vx, [-0.7; 1.7], eps);
 %! assert (vy, [-0.7; 1.7], eps);
 
-%!testif HAVE_QHULL <38295>
+%!testif HAVE_QHULL <*38295>
+%!testif HAVE_QHULL <*38295>
 %! x = [1,2,3];  y = [2,3,1];
 %! [vx, vy] = voronoi (x,y);
 %! assert (columns (vx), 3);
 
-%!testif HAVE_QHULL <37270>
+%!testif HAVE_QHULL <*37270>
+%!testif HAVE_QHULL <*37270>
 %! ## Duplicate points can cause an internal error
 %! x = [1,2,3, 3];  y = [2,3,1, 1];
 %! [vx, vy] = voronoi (x,y);
--- a/scripts/image/image.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/image/image.m	Fri Jun 09 15:34:03 2017 -0400
@@ -228,7 +228,8 @@
 %!  title ("image (-x, -y, img)");
 
 ## test hidden properties x/ydatamode
-%!test <42121>
+%!test <*42121>
+%!test <*42121>
 %! hf = figure ("visible", "off");
 %! unwind_protect
 %!   nx = 64; ny = 64;
--- a/scripts/image/imwrite.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/image/imwrite.m	Fri Jun 09 15:34:03 2017 -0400
@@ -230,7 +230,8 @@
 %!endfunction
 
 ## BMP images must be saved uncompressed by default
-%!testif HAVE_MAGICK <45565>
+%!testif HAVE_MAGICK <*45565>
+%!testif HAVE_MAGICK <*45565>
 %! assert (get_bmp_compression ("", [], "BMP"), 0);
 %! assert (get_bmp_compression ("", [], "bmp"), 0);
 %! assert (get_bmp_compression (".BMP"), 0);
--- a/scripts/io/importdata.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/io/importdata.m	Fri Jun 09 15:34:03 2017 -0400
@@ -529,7 +529,8 @@
 %! assert (d, "\t");
 %! assert (h, 0);
 
-%!test <43393>
+%!test <*43393>
+%!test <*43393>
 %! ## Distinguish double from complex when no delimiter is supplied
 %! fn  = tmpnam ();
 %! fid = fopen (fn, "w");
--- a/scripts/io/strread.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/io/strread.m	Fri Jun 09 15:34:03 2017 -0400
@@ -894,7 +894,8 @@
 %!                  "commentstyle", "shell"), ...
 %!         {"Hello"; "World!"});
 
-%!test <49454>
+%!test <*49454>
+%!test <*49454>
 %! assert (strread ("hello%foo\nworld, another%bar\r\nday", "%s", ...
 %!                  "commentstyle", "matlab", "delimiter", " ,"),...
 %!         {"hello"; "world"; "another"; "day"});
@@ -923,13 +924,15 @@
 %! assert (a, int32 (10));
 %! assert (b, {"a"});
 
-%!test <33536>
+%!test <*33536>
+%!test <*33536>
 %! [a, b, c] = strread ("1,,2", "%s%s%s", "delimiter", ",");
 %! assert (a{1}, "1");
 %! assert (b{1}, "");
 %! assert (c{1}, "2");
 
-%!test <33536>
+%!test <*33536>
+%!test <*33536>
 %!test
 %! a = strread ("[SomeText]", "[%s", "delimiter", "]");
 %! assert (a{1}, "SomeText");
@@ -984,7 +987,8 @@
 %! assert (c', [13, 24, 34]);
 %! assert (d', [15, 25, 35]);
 
-%!assert <44750> (strread ('/home/foo/','%s','delimiter','/','MultipleDelimsAsOne',1),
+%!assert <*44750> (strread ('/home/foo/','%s','delimiter','/','MultipleDelimsAsOne',1),
+%!assert <*44750> (strread ('/home/foo/','%s','delimiter','/','MultipleDelimsAsOne',1),
 %!                {"home"; "foo"})
 
 ## delimiter as sq_string and dq_string
@@ -1041,13 +1045,15 @@
 %! assert (a, NaN);
 %! assert (b, NaN);
 
-%!test <35999>
+%!test <*35999>
+%!test <*35999>
 %! [a, b, c] = strread ("", "%f");
 %! assert (isempty (a));
 %! assert (isempty (b));
 %! assert (isempty (c));
 
-%!test <37023>
+%!test <*37023>
+%!test <*37023>
 %! [a, b] = strread (" 1. 1 \n  2 3 \n", "%f %f", "endofline", "\n");
 %! assert (a, [1; 2], 1e-15);
 %! assert (b, [1; 3], 1e-15);
@@ -1057,28 +1063,32 @@
 %!        [NaN; 2; NaN; 4; 5; NaN; 7])
 
 ## Test #1 bug #42609
-%!test <42609>
+%!test <*42609>
+%!test <*42609>
 %! [a, b, c] = strread ("1 2 3\n4 5 6\n7 8 9\n", "%f %f %f\n");
 %! assert (a, [1; 4; 7]);
 %! assert (b, [2; 5; 8]);
 %! assert (c, [3; 6; 9]);
 
 ## Test #2 bug #42609
-%!test <42609>
+%!test <*42609>
+%!test <*42609>
 %! [a, b, c] = strread ("1 2\n3\n4 5\n6\n7 8\n9\n", "%f %f\n%f");
 %! assert (a, [1;4;7]);
 %! assert (b, [2; 5; 8]);
 %! assert (c, [3; 6; 9]);
 
 ## Test #3 bug #42609
-%!test <42609>
+%!test <*42609>
+%!test <*42609>
 %! [a, b, c] = strread ("1 2 3\n4 5 6\n7 8 9\n", '%f %f %f\n');
 %! assert (a, [1; 4; 7]);
 %! assert (b, [2; 5; 8]);
 %! assert (c, [3; 6; 9]);
 
 ## Test #4 bug #42609
-%!test <42609>
+%!test <*42609>
+%!test <*42609>
 %! [a, b, c] = strread ("1 2\n3\n4 5\n6\n7 8\n9\n", '%f %f\n%f');
 %! assert (a, [1;4;7]);
 %! assert (b, [2; 5; 8]);
@@ -1107,7 +1117,8 @@
 %!assert (strread ("Total: 32.5 % (of cm values)","Total: %f % (of cm values)"), 32.5, 1e-5)
 
 ## Test various forms of string format specifiers
-%!test <45712>
+%!test <*45712>
+%!test <*45712>
 %! str = "14 :1 z:2 z:3 z:5 z:11";
 %! [a, b, c, d] = strread (str, "%f %s %*s %3s %*3s %f", "delimiter", ":");
 %! assert ({a, b, c, d}, {14, {"1 z"}, {"3 z"}, 11});
--- a/scripts/io/textread.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/io/textread.m	Fri Jun 09 15:34:03 2017 -0400
@@ -476,7 +476,8 @@
 #%! assert (A, [0 2 0 4; 5 0 0 0], 1e-6);
 
 ### Test endofline
-#%!test <45046>
+#%!test <*45046>
+#%!test <*45046>
 #%! f = tempname ();
 #%! fid = fopen (f, "w");
 #%! fprintf (fid, "a\rb\rc");
@@ -490,7 +491,8 @@
 #%! unlink (f);
 
 ### Properly process single-quoted EOL args
-#%!test <46477>
+#%!test <*46477>
+#%!test <*46477>
 #%! f = tempname ();
 #%! fid = fopen (f, "w");
 #%! fprintf (fid, "hello, world!");
--- a/scripts/miscellaneous/orderfields.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/miscellaneous/orderfields.m	Fri Jun 09 15:34:03 2017 -0400
@@ -195,7 +195,8 @@
 %! assert (aa(2).y{1}, 6);
 
 ## Corner case of empty struct
-%!assert <40224> (orderfields (struct ()), struct ())
+%!assert <*40224> (orderfields (struct ()), struct ())
+%!assert <*40224> (orderfields (struct ()), struct ())
 %!test
 %! s(2,2).a = 1;
 %! s(1,1).b = 2;
--- a/scripts/optimization/qp.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/optimization/qp.m	Fri Jun 09 15:34:03 2017 -0400
@@ -421,7 +421,8 @@
 
 
 ## Test infeasible initial guess
-%!testif HAVE_GLPK <40536>
+%!testif HAVE_GLPK <*40536>
+%!testif HAVE_GLPK <*40536>
 %!
 %! H = 1;  q = 0;                # objective: x -> 0.5 x^2
 %! A = 1;  lb = 1;  ub = +inf;   # constraint: x >= 1
--- a/scripts/plot/appearance/axis.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/plot/appearance/axis.m	Fri Jun 09 15:34:03 2017 -0400
@@ -673,7 +673,8 @@
 %! end_unwind_protect
 
 ## Test 'axis tight' with differently oriented, differently numbered data vecs
-%!test <40036>
+%!test <*40036>
+%!test <*40036>
 %! hf = figure ("visible", "off");
 %! unwind_protect
 %!   Z = peaks (linspace (-3, 3, 49), linspace (-2, 2, 29));
--- a/scripts/plot/appearance/grid.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/plot/appearance/grid.m	Fri Jun 09 15:34:03 2017 -0400
@@ -192,7 +192,8 @@
 %! title ("Minor grid adapts to xticks (bug #45850)")
 
 ## linear scaling
-%!test <48533>
+%!test <*48533>
+%!test <*48533>
 %! hf = figure ("visible", "off");
 %! unwind_protect
 %!   hax = axes ();
@@ -251,7 +252,8 @@
 %! end_unwind_protect
 
 ## semilog scaling
-%!test <48533>
+%!test <*48533>
+%!test <*48533>
 %! hf = figure ("visible", "off");
 %! unwind_protect
 %!   hax = axes ();
--- a/scripts/plot/appearance/legend.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/plot/appearance/legend.m	Fri Jun 09 15:34:03 2017 -0400
@@ -1629,7 +1629,8 @@
 %!   graphics_toolkit (toolkit);
 %! end_unwind_protect
 
-%!test <42035>
+%!test <*42035>
+%!test <*42035>
 %! h = figure ("visible", "off");
 %! unwind_protect
 %!   hax1 = subplot (1,2,1);
--- a/scripts/plot/appearance/title.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/plot/appearance/title.m	Fri Jun 09 15:34:03 2017 -0400
@@ -113,7 +113,8 @@
 %!   close (hf);
 %! end_unwind_protect
 
-%!test <49469>
+%!test <*49469>
+%!test <*49469>
 %! hf = figure ("visible", "off");
 %! unwind_protect
 %!   ht = title ("Test FontSize Property");
--- a/scripts/plot/draw/hist.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/plot/draw/hist.m	Fri Jun 09 15:34:03 2017 -0400
@@ -218,10 +218,13 @@
 %! endfor
 %!assert (hist (1,1), 1)
 %!assert (size (hist (randn (750,240), 200)), [200,240])
-%!assert <42394> (isempty (hist (rand (10,2), 0:5, 1)), false)
-%!assert <42394> (isempty (hist (rand (10,2), 0:5, [1 1])), false)
+%!assert <*42394> (isempty (hist (rand (10,2), 0:5, 1)), false)
+%!assert <*42394> (isempty (hist (rand (10,2), 0:5, 1)), false)
+%!assert <*42394> (isempty (hist (rand (10,2), 0:5, [1 1])), false)
+%!assert <*42394> (isempty (hist (rand (10,2), 0:5, [1 1])), false)
 
-%!test <47707>
+%!test <*47707>
+%!test <*47707>
 %! y = [1  9  2  2  9  3  8  9  1  7  1  1  3  2  4  4  8  2  1  9  4  1 ...
 %!      2  3  1  1  6  5  5  3  9  9  1  1  8  7  7  2  4  1];
 %! [n, x] = hist (y, 10);
--- a/scripts/polynomial/residue.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/polynomial/residue.m	Fri Jun 09 15:34:03 2017 -0400
@@ -406,7 +406,8 @@
 %! assert (ar, a, 1e-12);
 
 ## The following test is due to Bernard Grung
-%!test <34266>
+%!test <*34266>
+%!test <*34266>
 %! z1 =  7.0372976777e6;
 %! p1 = -3.1415926536e9;
 %! p2 = -4.9964813512e8;
@@ -424,7 +425,8 @@
 %! assert (br, [0,0,b], 1e-7);
 %! assert (ar, a, 1e-8);
 
-%!test <49291>
+%!test <*49291>
+%!test <*49291>
 %! rf = [1e3, 2e3, 1e3, 2e3];
 %! cf = [316.2e-9, 50e-9, 31.6e-9, 5e-9];
 %! [num, den] = residue (1./cf,-1./(rf.*cf),0);
@@ -432,7 +434,8 @@
 %! assert (numel (den), 5);
 %! assert (den(1), 1);
 
-%!test <51148>
+%!test <*51148>
+%!test <*51148>
 %! r = [1.0000e+18, 3.5714e+12, 2.2222e+11, 2.1739e+10];
 %! pin = [-1.9231e+15, -1.6234e+09, -4.1152e+07, -1.8116e+06];
 %! k = 0;
--- a/scripts/set/setdiff.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/set/setdiff.m	Fri Jun 09 15:34:03 2017 -0400
@@ -115,12 +115,18 @@
 %! assert (c, a(ia));
 
 ## Test output orientation compatibility
-%!assert <42577> (setdiff ([1:5], 2), [1,3,4,5])
-%!assert <42577> (setdiff ([1:5]', 2), [1;3;4;5])
-%!assert <42577> (setdiff ([1:5], [2:3]), [1,4,5])
-%!assert <42577> (setdiff ([1:5], [2:3]'), [1,4,5])
-%!assert <42577> (setdiff ([1:5]', [2:3]), [1;4;5])
-%!assert <42577> (setdiff ([1:5]', [2:3]'), [1;4;5])
+%!assert <*42577> (setdiff ([1:5], 2), [1,3,4,5])
+%!assert <*42577> (setdiff ([1:5], 2), [1,3,4,5])
+%!assert <*42577> (setdiff ([1:5]', 2), [1;3;4;5])
+%!assert <*42577> (setdiff ([1:5]', 2), [1;3;4;5])
+%!assert <*42577> (setdiff ([1:5], [2:3]), [1,4,5])
+%!assert <*42577> (setdiff ([1:5], [2:3]), [1,4,5])
+%!assert <*42577> (setdiff ([1:5], [2:3]'), [1,4,5])
+%!assert <*42577> (setdiff ([1:5], [2:3]'), [1,4,5])
+%!assert <*42577> (setdiff ([1:5]', [2:3]), [1;4;5])
+%!assert <*42577> (setdiff ([1:5]', [2:3]), [1;4;5])
+%!assert <*42577> (setdiff ([1:5]', [2:3]'), [1;4;5])
+%!assert <*42577> (setdiff ([1:5]', [2:3]'), [1;4;5])
 
 %!test
 %! a = rand (3,3,3);
--- a/scripts/signal/fftshift.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/signal/fftshift.m	Fri Jun 09 15:34:03 2017 -0400
@@ -139,7 +139,8 @@
 %! assert (fftshift (y), "bcdefga");
 
 ## Test N-dimensional input
-%!test <45207>
+%!test <*45207>
+%!test <*45207>
 %! x = [0:3];
 %! x = x + x' + reshape (x, [1 1 4]);
 %! y1 = [4 5 2 3; 5 6 3 4; 2 3 0 1; 3 4 1 2];
--- a/scripts/signal/ifftshift.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/signal/ifftshift.m	Fri Jun 09 15:34:03 2017 -0400
@@ -124,7 +124,8 @@
 %! assert (ifftshift (y), "defgabc");
 
 ## Test N-dimensional input
-%!test <45207>
+%!test <*45207>
+%!test <*45207>
 %! x = [0:3];
 %! x = x + x' + reshape (x, [1 1 4]);
 %! y1 = [4 5 2 3; 5 6 3 4; 2 3 0 1; 3 4 1 2];
--- a/scripts/specfun/nthroot.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/specfun/nthroot.m	Fri Jun 09 15:34:03 2017 -0400
@@ -94,7 +94,8 @@
 %!assert (nthroot (-Inf, -7), 0)
 
 ## This should not generate a division by zero warning
-%!test <43492>
+%!test <*43492>
+%!test <*43492>
 %! warnmsg = lastwarn ();
 %! assert (nthroot (0, 2), 0);
 %! assert (lastwarn (), warnmsg);
--- a/scripts/special-matrix/magic.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/special-matrix/magic.m	Fri Jun 09 15:34:03 2017 -0400
@@ -88,7 +88,8 @@
 ## Not a magic square but we must return something (bug #46672).
 ## While one day we may change the actual return of magic (2),
 ## this properties still must be true.
-%!test <46672>
+%!test <*46672>
+%!test <*46672>
 %! m = magic (2);
 %! assert (size (m), [2 2]);
 %! assert (unique (m), [1; 2; 3; 4]);
--- a/scripts/statistics/base/median.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/statistics/base/median.m	Fri Jun 09 15:34:03 2017 -0400
@@ -118,8 +118,10 @@
 %! b = rand (3,4,6,5);
 %! x = sort (a, 4);
 %! y = sort (b, 3);
-%!assert <35679> (median (a, 4), x(:, :, :, 3))
-%!assert <35679> (median (b, 3), (y(:, :, 3, :) + y(:, :, 4, :))/2)
+%!assert <*35679> (median (a, 4), x(:, :, :, 3))
+%!assert <*35679> (median (a, 4), x(:, :, :, 3))
+%!assert <*35679> (median (b, 3), (y(:, :, 3, :) + y(:, :, 4, :))/2)
+%!assert <*35679> (median (b, 3), (y(:, :, 3, :) + y(:, :, 4, :))/2)
 
 ## Test non-floating point types
 %!assert (median ([true, false]), true)
--- a/scripts/statistics/base/quantile.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/statistics/base/quantile.m	Fri Jun 09 15:34:03 2017 -0400
@@ -321,7 +321,8 @@
 %! yexp = median (x, dim);
 %! assert (yobs, yexp);
 
-%!assert <45455> (quantile ([1 3 2], 0.5, 1), [1 3 2])
+%!assert <*45455> (quantile ([1 3 2], 0.5, 1), [1 3 2])
+%!assert <*45455> (quantile ([1 3 2], 0.5, 1), [1 3 2])
 
 ## Test input validation
 %!error quantile ()
--- a/scripts/strings/base2dec.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/strings/base2dec.m	Fri Jun 09 15:34:03 2017 -0400
@@ -121,7 +121,8 @@
 %!assert (base2dec ("-1", 2), NaN)
 %!assert (base2dec ({"A1", "1A"}, 16), [161; 26])
 
-%!assert <35621> (base2dec (["0"; "1"], 2), [0; 1])
+%!assert <*35621> (base2dec (["0"; "1"], 2), [0; 1])
+%!assert <*35621> (base2dec (["0"; "1"], 2), [0; 1])
 
 ## Test input validation
 %!error base2dec ()
--- a/scripts/strings/strcat.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/strings/strcat.m	Fri Jun 09 15:34:03 2017 -0400
@@ -151,8 +151,10 @@
 %!assert (all (strcmp (strcat ("a", {"bb", "ccc"}), {"abb", "accc"})))
 
 ## test with a single string or cell input
-%!assert <49094> (strcat ("foo    "), "foo")
-%!assert <49094> (strcat ({"foo"}), {"foo"})
+%!assert <*49094> (strcat ("foo    "), "foo")
+%!assert <*49094> (strcat ("foo    "), "foo")
+%!assert <*49094> (strcat ({"foo"}), {"foo"})
+%!assert <*49094> (strcat ({"foo"}), {"foo"})
 
 %!assert (strcat (1), char (1))
 %!assert (strcat (1, 2), strcat (char (1), char (2)))
--- a/scripts/strings/strmatch.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/strings/strmatch.m	Fri Jun 09 15:34:03 2017 -0400
@@ -114,7 +114,8 @@
 %!assert (strmatch ('', { '', '% comment', 'var a = 5', ''}, "exact"), [1,4])
 
 ## Weird Matlab corner cases
-%!test <49601>
+%!test <*49601>
+%!test <*49601>
 %! assert (strmatch (" ", " "), 1);
 %! assert (strmatch (" ", "   "), 1);
 %! assert (strmatch ("  ", " "), []);
--- a/scripts/strings/strsplit.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/strings/strsplit.m	Fri Jun 09 15:34:03 2017 -0400
@@ -297,10 +297,13 @@
 %! assert (strsplit ("aa", "a"), {"", ""});
 %! assert (strsplit ("aaa", "a"), {"", ""});
 
-%!assert <44641> (strsplit ("xxx<yyy", "<"), {"xxx", "yyy"})
-%!assert <44641> (strsplit ('xxx\yyy', '\'), {"xxx", "yyy"})
+%!assert <*44641> (strsplit ("xxx<yyy", "<"), {"xxx", "yyy"})
+%!assert <*44641> (strsplit ("xxx<yyy", "<"), {"xxx", "yyy"})
+%!assert <*44641> (strsplit ('xxx\yyy', '\'), {"xxx", "yyy"})
+%!assert <*44641> (strsplit ('xxx\yyy', '\'), {"xxx", "yyy"})
 
-%!assert <47403> (strsplit ('xxx+yyy', '+'), {"xxx", "yyy"})
+%!assert <*47403> (strsplit ('xxx+yyy', '+'), {"xxx", "yyy"})
+%!assert <*47403> (strsplit ('xxx+yyy', '+'), {"xxx", "yyy"})
 
 ## Test input validation
 %!error strsplit ()
--- a/scripts/testfun/__run_test_suite__.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/testfun/__run_test_suite__.m	Fri Jun 09 15:34:03 2017 -0400
@@ -21,7 +21,7 @@
 ## Undocumented internal function.
 ## @end deftypefn
 
-function [pass, fail, xfail, xbug, skip, rtskip] = __run_test_suite__ (fcndirs, fixedtestdirs)
+function [pass, fail, xfail, xbug, skip, rtskip, regress] = __run_test_suite__ (fcndirs, fixedtestdirs)
 
   testsdir = __octave_config_info__ ("octtestsdir");
   libinterptestdir = fullfile (testsdir, "libinterp");
@@ -53,29 +53,31 @@
         error ("__run_test_suite__: could not open %s for writing", logfile);
       endif
       test ("", "explain", fid);
-      dp = dn = dxf = dxb = dsk = drtsk = 0;
+      dp = dn = dxf = dxb = dsk = drtsk = drgrs = 0;
       puts ("\nIntegrated test scripts:\n\n");
       for i = 1:length (fcndirs)
-        [p, n, xf, xb, sk, rtsk] = run_test_script (fid, fcndirs{i});
+        [p, n, xf, xb, sk, rtsk, rgrs] = run_test_script (fid, fcndirs{i});
         dp += p;
         dn += n;
         dxf += xf;
         dxb += xb;
         dsk += sk;
         drtsk += rtsk;
+        drgrs += rgrs;
       endfor
       puts ("\nFixed test scripts:\n\n");
       for i = 1:length (fixedtestdirs)
-        [p, n, xf, xb, sk, rtsk] = run_test_dir (fid, fixedtestdirs{i});
+        [p, n, xf, xb, sk, rtsk, rgrs] = run_test_dir (fid, fixedtestdirs{i});
         dp += p;
         dn += n;
         dxf += xf;
         dxb += xb;
         dsk += sk;
         drtsk += rtsk;
+        drgrs += rgrs;
       endfor
       puts ("\nSummary:\n\n");
-      nfail = dn - dp - dxf - dxb;
+      nfail = dn - dp - dxf - dxb - drgrs;
       printf ("  %-30s %6d\n", "PASS", dp);
       printf ("  %-30s %6d\n", "FAIL", nfail);
       if (dxf > 0)
@@ -84,6 +86,9 @@
       if (dxb > 0)
         printf ("  %-30s %6d\n", "XFAIL (reported bug)", dxb);
       endif
+      if (drgrs > 0)
+        printf ("  %-30s %6d\n", "XFAIL (regression)", drgrs);
+      endif
       if (dsk > 0)
         printf ("  %-30s %6d\n", "SKIPPED (feature)", dsk);
       endif
@@ -139,6 +144,7 @@
     xbug = dxb;
     skip = dsk;
     rtskip = drtsk;
+    regress = drgrs;
   endif
 
 endfunction
@@ -148,11 +154,11 @@
   printf ("  %s %s", nm, filler);
 endfunction
 
-function print_pass_fail (p, n, xf, xb, sk, rtsk)
+function print_pass_fail (p, n, xf, xb, sk, rtsk, rgrs)
 
-  if ((n + sk + rtsk) > 0)
+  if ((n + sk + rtsk + rgrs) > 0)
     printf (" PASS   %4d/%-4d", p, n);
-    nfail = n - p - xf - xb;
+    nfail = n - p - xf - xb - rgrs;
     if (nfail > 0)
       printf ("\n%71s %3d", "FAIL ", nfail);
     endif
@@ -162,12 +168,15 @@
     if (rtsk > 0)
       printf ("\n%71s %3d", "(run-time condition) SKIP ", rtsk);
     endif
-    if (xf > 0)
-      printf ("\n%71s %3d", "(expected failure) XFAIL", xf);
+    if (rgrs > 0)
+      printf ("\n%71s %3d", "(regression) XFAIL", rgrs);
     endif
     if (xb > 0)
       printf ("\n%71s %3d", "(reported bug) XFAIL", xb);
     endif
+    if (xf > 0)
+      printf ("\n%71s %3d", "(expected failure) XFAIL", xf);
+    endif
   endif
   puts ("\n");
 
@@ -208,23 +217,24 @@
 
 endfunction
 
-function [dp, dn, dxf, dxb, dsk, drtsk] = run_test_dir (fid, d)
+function [dp, dn, dxf, dxb, dsk, drtsk, drgrs] = run_test_dir (fid, d)
   global files_with_tests;
   global files_with_no_tests;
 
   lst = dir (d);
-  dp = dn = dxf = dxb = dsk = drtsk = 0;
+  dp = dn = dxf = dxb = dsk = drtsk = drgrs = 0;
   for i = 1:length (lst)
     nm = lst(i).name;
     if (lst(i).isdir
         && nm(1) != "." && ! strcmp (nm, "private") && nm(1) != "@")
-      [p, n, xf, xb, sk, rtsk] = run_test_dir (fid, [d, filesep, nm]);
+      [p, n, xf, xb, sk, rtsk, rgrs] = run_test_dir (fid, [d, filesep, nm]);
       dp += p;
       dn += n;
       dxf += xf;
       dxb += xb;
       dsk += sk;
       drtsk += rtsk;
+      drgrs += rgrs;
     endif
   endfor
 
@@ -238,8 +248,8 @@
         ffnm = fullfile (d, nm);
         if (has_tests (ffnm))
           print_test_file_name (nm);
-          [p, n, xf, xb, sk, rtsk] = test (nm, "quiet", fid);
-          print_pass_fail (p, n, xf, xb, sk, rtsk);
+          [p, n, xf, xb, sk, rtsk, rgrs] = test (nm, "quiet", fid);
+          print_pass_fail (p, n, xf, xb, sk, rtsk, rgrs);
           files_with_tests(end+1) = ffnm;
         else
           files_with_no_tests(end+1) = ffnm;
@@ -250,6 +260,7 @@
         dxb += xb;
         dsk += sk;
         drtsk += rtsk;
+        drgrs += rgrs;
       endif
     endfor
   unwind_protect_cleanup
@@ -258,24 +269,25 @@
 
 endfunction
 
-function [dp, dn, dxf, dxb, dsk, drtsk] = run_test_script (fid, d)
+function [dp, dn, dxf, dxb, dsk, drtsk, drgrs] = run_test_script (fid, d)
   global files_with_tests;
   global files_with_no_tests;
   global topsrcdir;
   global topbuilddir;
 
   lst = dir (d);
-  dp = dn = dxf = dxb = dsk = drtsk = 0;
+  dp = dn = dxf = dxb = dsk = drtsk = drgrs = 0;
   for i = 1:length (lst)
     nm = lst(i).name;
     if (lst(i).isdir && nm(1) != ".")
-      [p, n, xf, xb, sk, rtsk] = run_test_script (fid, [d, filesep, nm]);
+      [p, n, xf, xb, sk, rtsk, rgrs] = run_test_script (fid, [d, filesep, nm]);
       dp += p;
       dn += n;
       dxf += xf;
       dxb += xb;
       dsk += sk;
       drtsk += rtsk;
+      drgrs += rgrs;
     endif
   endfor
 
@@ -296,14 +308,15 @@
         tmp = strrep (f, [topsrcdir, filesep], "");
         tmp = strrep (tmp, [topbuilddir, filesep], "");
         print_test_file_name (tmp);
-        [p, n, xf, xb, sk, rtsk] = test (f, "quiet", fid);
-        print_pass_fail (p, n, xf, xb, sk, rtsk);
+        [p, n, xf, xb, sk, rtsk, rgrs] = test (f, "quiet", fid);
+        print_pass_fail (p, n, xf, xb, sk, rtsk, rgrs);
         dp += p;
         dn += n;
         dxf += xf;
         dxb += xb;
         dsk += sk;
         drtsk += rtsk;
+        drgrs += rgrs;
         files_with_tests(end+1) = f;
       else
         ## To reduce the list length, only mark .cc files that contain
--- a/scripts/testfun/test.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/testfun/test.m	Fri Jun 09 15:34:03 2017 -0400
@@ -22,7 +22,7 @@
 ## @deftypefnx {} {} test ("@var{name}", "quiet|normal|verbose", @var{fid})
 ## @deftypefnx {} {} test ("@var{name}", "quiet|normal|verbose", @var{fname})
 ## @deftypefnx {} {@var{success} =} test (@dots{})
-## @deftypefnx {} {[@var{n}, @var{nmax}, @var{nxfail}, @var{nbug}, @var{nskip}, @var{nrtskip}] =} test (@dots{})
+## @deftypefnx {} {[@var{n}, @var{nmax}, @var{nxfail}, @var{nbug}, @var{nskip}, @var{nrtskip}, @var{nregression}] =} test (@dots{})
 ## @deftypefnx {} {[@var{code}, @var{idx}] =} test ("@var{name}", "grabdemo")
 ## @deftypefnx {} {} test ([], "explain", @var{fid})
 ## @deftypefnx {} {} test ([], "explain", @var{fname})
@@ -83,8 +83,9 @@
 ## the total number of tests in the file (@var{nmax}), the number of xtest
 ## failures (@var{nxfail}), the number of tests failed due known bugs
 ## (@var{nbug}), the number of tests skipped due to missing features
-## (@var{nskip}), and the number of tests skipped due to run-time
-## conditions (@var{nrtskip}) are returned.
+## (@var{nskip}), the number of tests skipped due to run-time
+## conditions (@var{nrtskip}), and the number of regressions
+## (@var{nregression}) are returned.
 ##
 ## Example
 ##
@@ -120,7 +121,7 @@
 ## Shared variables are eval'ed into the current workspace and therefore might
 ## collide with the names used in the test.m function itself.
 
-function [__n, __nmax, __nxfail, __nbug, __nskip, __nrtskip] = test (__name, __flag = "normal", __fid = [])
+function [__n, __nmax, __nxfail, __nbug, __nskip, __nrtskip, __nregression] = test (__name, __flag = "normal", __fid = [])
 
   ## Output from test is prefixed by a "key" to quickly understand the issue.
   persistent __signal_fail  = "!!!!! ";
@@ -297,7 +298,7 @@
 
   ## Process each block separately, initially with no shared variables.
   __tests = __successes = 0;
-  __xfail = __xbug = __xskip = __xrtskip = 0;
+  __xfail = __xbug = __xskip = __xrtskip = __xregression = 0;
   __shared = " ";
   __shared_r = " ";
   __clearfcn = "";
@@ -332,6 +333,7 @@
       __istest = false;
       __isxtest = false;
       __bug_id = "";
+      __fixed_bug = false;
 
 ### DEMO
 
@@ -434,10 +436,17 @@
         ## There is no processing to be done here, just skip to next block.
         __code = "";
 
-### ASSERT/FAIL
+### ASSERT
+### ASSERT <BUG-ID>
+### FAIL
+### FAIL <BUG-ID>
+###
+###   BUG-ID is a bug number from the bug tracker.  A prefix of '*'
+###   indicates a bug that has been fixed.  Tests that fail for fixed
+###   bugs are reported as regressions.
 
       elseif (strcmp (__type, "assert") || strcmp (__type, "fail"))
-        [__bug_id, __code] = getbugid (__code);
+        [__bug_id, __code, __fixed_bug] = getbugid (__code);
         if (isempty (__bug_id))
           __istest = true;
         else
@@ -529,8 +538,8 @@
 
 ### TESTIF HAVE_FEATURE
 ### TESTIF HAVE_FEATURE ; RUNTIME_CONDITION
-### TESTIF HAVE_FEATURE <bug-id>
-### TESTIF HAVE_FEATURE ; RUNTIME_CONDITION <bug-id>
+### TESTIF HAVE_FEATURE <BUG-ID>
+### TESTIF HAVE_FEATURE ; RUNTIME_CONDITION <BUG-ID>
 ###
 ###   HAVE_FEATURE is a comma- or whitespace separated list of
 ###   macro names that may be checked with __have_feature__.
@@ -538,6 +547,10 @@
 ###   RUNTIME_CONDITION is an expression to evaluate to check
 ###   whether some condition is met when the test is executed.  For
 ###   example, have_window_system.
+###
+###   BUG-ID is a bug number from the bug tracker.  A prefix of '*'
+###   indicates a bug that has been fixed.  Tests that fail for fixed
+###   bugs are reported as regressions.
 
       elseif (strcmp (__type, "testif"))
         __e = regexp (__code, '.$', 'lineanchors', 'once');
@@ -550,6 +563,10 @@
           __idx2 = index (__tmp, ">");
           if (__idx2)
             __bug_id = __tmp(1:__idx2-1);
+            if (strncmp (__bug_id, "*", 1))
+              __bug_id = __bug_id(2:end);
+              __fixed_bug = true;
+            endif
             __feat_line = __feat_line(1:__idx1-1);
           endif
         endif
@@ -583,10 +600,14 @@
         endif
 
 ### TEST
-### TEST <bug-id>
+### TEST <BUG-ID>
+###
+###   BUG-ID is a bug number from the bug tracker.  A prefix of '*'
+###   indicates a bug that has been fixed.  Tests that fail for fixed
+###   bugs are reported as regressions.
 
       elseif (strcmp (__type, "test"))
-        [__bug_id, __code] = getbugid (__code);
+        [__bug_id, __code, __fixed_bug] = getbugid (__code);
         if (! isempty (__bug_id))
           __isxtest = true;
         else
@@ -594,11 +615,16 @@
         endif
         ## Code will be evaluated below.
 
-### XTEST <bug-id>
+### XTEST
+### XTEST <BUG-ID>
+###
+###   BUG-ID is a bug number from the bug tracker.  A prefix of '*'
+###   indicates a bug that has been fixed.  Tests that fail for fixed
+###   bugs are reported as regressions.
 
       elseif (strcmp (__type, "xtest"))
         __isxtest = true;
-        [__bug_id, __code] = getbugid (__code);
+        [__bug_id, __code, __fixed_bug] = getbugid (__code);
         ## Code will be evaluated below.
 
 ### Comment block.
@@ -636,14 +662,27 @@
             __success = false;
             if (__isxtest)
               if (isempty (__bug_id))
-                __xfail += 1;
-                __msg = "known failure";
+                if (__fixed_bug)
+                  __xregression += 1;
+                  __msg = "regression";
+                else
+                  __xfail += 1;
+                  __msg = "known failure";
+                endif
               else
-                __xbug += 1;
+                if (__fixed_bug)
+                  __xregression += 1;
+                else
+                  __xbug += 1;
+                endif
                 if (all (isdigit (__bug_id)))
                   __bug_id = ["http://octave.org/testfailure/?" __bug_id];
                 endif
-                __msg = ["known bug: " __bug_id];
+                if (__fixed_bug)
+                  __msg = ["regression: " __bug_id];
+                else
+                  __msg = ["known bug: " __bug_id];
+                endif
               endif
             else
               __msg = "test failed";
@@ -739,12 +778,13 @@
   elseif (nargout == 1)
     __n = __all_success;
   else
-    __n      = __successes;
-    __nmax   = __tests;
+    __n = __successes;
+    __nmax = __tests;
     __nxfail = __xfail;
-    __nbug   = __xbug;
-    __nskip  = __xskip;
+    __nbug = __xbug;
+    __nskip = __xskip;
     __nrtskip = __xrtskip;
+    __nregression = __xregression;
   endif
 
 endfunction
@@ -803,16 +843,21 @@
 endfunction
 
 ## Strip <bug-id> from '<pattern> code'.
-function [bug_id, rest] = getbugid (str)
+function [bug_id, rest, fixed] = getbugid (str)
 
   bug_id = "";
-  id = [];
   rest = str;
+  fixed = false;
+
   str = trimleft (str);
   if (! isempty (str) && str(1) == "<")
     close = index (str, ">");
     if (close)
       bug_id = str(2:close-1);
+      if (strncmp (bug_id, "*", 1))
+        bug_id = bug_id(2:end);
+        fixed = true;
+      endif
       rest = str(close+1:end);
     endif
   endif
--- a/scripts/time/datestr.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/time/datestr.m	Fri Jun 09 15:34:03 2017 -0400
@@ -332,7 +332,8 @@
 %!test
 %! obs = toupper (datestr (testtime,16));
 %! assert (obs, " 2:33 AM");
-%!test <48071>
+%!test <*48071>
+%!test <*48071>
 %! testtime2 = testtime;
 %! testtime2(4) = 15;
 %! obs = toupper (datestr (testtime2,16));
--- a/scripts/time/datevec.m	Fri Jun 09 14:06:41 2017 -0400
+++ b/scripts/time/datevec.m	Fri Jun 09 15:34:03 2017 -0400
@@ -362,7 +362,8 @@
 %!        [2015,6,1,15,7,12.12])
 
 ## Test structure of return value
-%!test <42334>
+%!test <*42334>
+%!test <*42334>
 %! [~, ~, d] = datevec ([1 2; 3 4]);
 %! assert (d, [1 2; 3 4]);