# HG changeset patch # User Julien Bect # Date 1361876805 -3600 # Node ID 797ac81586d1da502243583eb4f78c6a08a00367 # Parent 73a21ade0b6b7d6e45c973dfd4c745261d3a3a96 Modify pt-mat.cc to solve a problem related to vertcat/horzcat overloading. * pt-mat.cc (tm_row_const::tm_row_const_rep::init): Do not check dimension consistency when at least one of the elements is an object (this was preventing horzcat overloading from working properly, see bug #38128). (tm_const::init): Same thing for vertical concatenation (this was preventing vertcat overloading from working properly, see bug #38128). * test/classes/classes.tst: Add tests for the vertical and horizontal concatenation of objects when neither vertcat() nor horzcat() is overloaded. diff -r 73a21ade0b6b -r 797ac81586d1 doc/interpreter/contributors.in --- a/doc/interpreter/contributors.in Tue Feb 26 02:52:48 2013 -0500 +++ b/doc/interpreter/contributors.in Tue Feb 26 12:06:45 2013 +0100 @@ -10,6 +10,7 @@ Alexander Barth David Bateman Heinz Bauschke +Julien Bect Roman Belov Karl Berry David Billinghurst diff -r 73a21ade0b6b -r 797ac81586d1 libinterp/parse-tree/pt-mat.cc --- a/libinterp/parse-tree/pt-mat.cc Tue Feb 26 02:52:48 2013 -0500 +++ b/libinterp/parse-tree/pt-mat.cc Tue Feb 26 12:06:45 2013 +0100 @@ -402,7 +402,7 @@ first_elem = false; dv = this_elt_dv; } - else if (! dv.hvcat (this_elt_dv, 1)) + else if ((! any_class) && (! dv.hvcat (this_elt_dv, 1))) { eval_error ("horizontal dimensions mismatch", dv, this_elt_dv); break; @@ -644,7 +644,7 @@ dv(1) = this_elt_nc; dv(0) += this_elt_nr; } - else if (! dv.hvcat (this_elt_dv, 0)) + else if ((!any_class) && (!dv.hvcat (this_elt_dv, 0))) { eval_error ("vertical dimensions mismatch", dv, this_elt_dv); return; diff -r 73a21ade0b6b -r 797ac81586d1 test/classes/classes.tst --- a/test/classes/classes.tst Tue Feb 26 02:52:48 2013 -0500 +++ b/test/classes/classes.tst Tue Feb 26 12:06:45 2013 +0100 @@ -304,6 +304,10 @@ %!assert (s1 >= (x1 - 1)) %!assert (x1 >= (s1 - 1)) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Testing horizontal & vertical concatenation %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% Test overloaded vertcat() for the Snork class %% See bug #38170 (http://savannah.gnu.org/bugs/?38170) %!test s = [s1; s2]; assert (isa (s, 'Snork') && isequal (s.gick, [x1; x2])); @@ -316,6 +320,20 @@ %!xtest s = [s1 x2]; assert (isa (s, 'Snork') && isequal (s.gick, [x1 x2])); %!xtest s = [x1 s2]; assert (isa (s, 'Snork') && isequal (s.gick, [x1 x2])); +%% Test with the Blork class, where neither vertcat() nor horzcat() is overloaded +%!shared x1, x2, x3 +%!test x1 = Blork(); +%!test x2 = [x1 x1]; +%!assert (isa (x2, 'Blork') && isequal (size (x2), [1 2])); +%!test x2 = [x1 51]; +%!assert (isa (x2, 'Blork') && isequal (size (x2), [1 2])); +%!test x3 = [x2; x2]; +%!assert (isa (x3, 'Blork') && isequal (size (x3), [2 2])); +%!test x3 = [x2; [51 x1]]; +%!assert (isa (x3, 'Blork') && isequal (size (x3), [2 2])); +%!error x4 = [x1 x3]; +%!error x4 = [x1; x3]; + %%%%%%%%%%%%%%%%%%%%%%%% %% Testing precedence %% %%%%%%%%%%%%%%%%%%%%%%%%