changeset 29316:09f99fe5190c stable

Fix ignored output from user function in left side of assignment (bug #59704). * libinterp/parse-tree/pt-assign.cc (tree_multi_assignment::evaluate_n): Set lvalue list of tree_evaluator only to process the right side of the assignment. Reset it to null after that. * test/bug-59704/bug59704_2.m, test/bug-59704/bug-59704.tst, test/bug-59704/module.mk: Add new test case.
author Fernando Alvarruiz <feralber@upvnet.upv.es>
date Sun, 03 Jan 2021 20:48:09 +0100
parents 67857e94604a
children d680d5ebafaa 3926dcfde203
files libinterp/parse-tree/pt-assign.cc test/bug-59704/bug-59704.tst test/bug-59704/bug59704_1.m test/bug-59704/bug59704_2.m test/bug-59704/module.mk
diffstat 5 files changed, 44 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/parse-tree/pt-assign.cc	Mon Dec 28 18:24:04 2020 +0100
+++ b/libinterp/parse-tree/pt-assign.cc	Sun Jan 03 20:48:09 2021 +0100
@@ -204,6 +204,8 @@
                                            ? rhs_val1(0).list_value ()
                                            : rhs_val1);
 
+        tw.set_lvalue_list (nullptr);
+
         octave_idx_type k = 0;
 
         octave_idx_type n = rhs_val.length ();
--- a/test/bug-59704/bug-59704.tst	Mon Dec 28 18:24:04 2020 +0100
+++ b/test/bug-59704/bug-59704.tst	Sun Jan 03 20:48:09 2021 +0100
@@ -2,3 +2,8 @@
 %! o = bug59704_1 ();
 %! o.test ();
 %! assert (o.p, [])
+
+%!test
+%! o = bug59704_2 ();
+%! [~, o(1)] = size (rand (2, 5));
+%! assert (o(1), 5)
--- a/test/bug-59704/bug59704_1.m	Mon Dec 28 18:24:04 2020 +0100
+++ b/test/bug-59704/bug59704_1.m	Sun Jan 03 20:48:09 2021 +0100
@@ -6,12 +6,12 @@
 
   methods
 
-    function n = numel(this, varargin)
+    function n = numel (this, varargin)
       n = 1;
     endfunction
 
-    function test(this)
-      [~, this.p] = bug59704_1_test(this.p);
+    function test (this)
+      [~, this.p] = bug59704_1_test (this.p);
     endfunction
 
   endmethods
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/bug-59704/bug59704_2.m	Sun Jan 03 20:48:09 2021 +0100
@@ -0,0 +1,33 @@
+classdef bug59704_2 < handle
+
+  properties
+    data_
+  endproperties
+
+  methods
+
+    function obj = bug59704_2 ()
+      obj.data_ = 1001:1005;
+    endfunction
+
+    function r = subsref (obj, S)
+      ## Transform: obj(index) --> obj.data_(index)
+      if strcmp (S(1).type, '()')
+        r = subsref (obj.data_, S);
+      else
+        r = builtin('subsref', obj, S);
+      endif
+    endfunction
+
+    function obj = subsasgn (obj, S, B)
+      ## Transform: obj(index) --> obj.data_(index)
+      if strcmp (S(1).type, '()')
+        obj.data_ = subsasgn (obj.data_, S, B);
+      else
+        obj = builtin ('subsasgn', obj, S, B);
+      endif
+    endfunction
+
+  endmethods
+
+endclassdef
--- a/test/bug-59704/module.mk	Mon Dec 28 18:24:04 2020 +0100
+++ b/test/bug-59704/module.mk	Sun Jan 03 20:48:09 2021 +0100
@@ -1,6 +1,7 @@
 bug_59704_TEST_FILES = \
   %reldir%/bug59704_1.m \
   %reldir%/bug59704_1_test.m \
+  %reldir%/bug59704_2.m \
   %reldir%/bug-59661.tst
 
 TEST_FILES += $(bug_59704_TEST_FILES)