changeset 16140:797ac81586d1

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.
author Julien Bect <julien.bect@supelec.fr>
date Tue, 26 Feb 2013 12:06:45 +0100
parents 73a21ade0b6b
children c6b2409672e9
files doc/interpreter/contributors.in libinterp/parse-tree/pt-mat.cc test/classes/classes.tst
diffstat 3 files changed, 21 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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;
--- 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 <dimension mismatch> x4 = [x1  x3];
+%!error <dimension mismatch> x4 = [x1; x3];
+
 %%%%%%%%%%%%%%%%%%%%%%%%
 %% Testing precedence %%
 %%%%%%%%%%%%%%%%%%%%%%%%