changeset 27666:3e8faed1b7d8

Remove wrapper template class NoAlias<T> (bug #56752) * liboctave/array/Array.h: remove template definition * libinterp/corefcn/cellfun.cc, libinterp/corefcn/data.cc, libinterp/corefcn/xpow.cc, libinterp/octave-value/ov-cell.cc, libinterp/octave-value/ov-cell.cc, libinterp/octave-value/ov-flt-re-mat.cc, libinterp/octave-value/ov-flt-re-mat.cc, liboctave/array/CMatrix.cc, liboctave/array/CRowVector.cc, liboctave/array/CRowVector.cc, liboctave/array/Sparse.cc, liboctave/array/dMatrix.cc, liboctave/array/dRowVector.cc, liboctave/array/fCMatrix.cc, liboctave/array/fCRowVector.cc, liboctave/array/fMatrix.cc, liboctave/array/fRowVector.cc: use xelem method explicitly instead of the NoAlias wrapper.
author Carlo de Falco <carlo.defalco@polimi.it>
date Mon, 30 Sep 2019 11:05:42 +0200
parents a1271c5b621a
children 41b32ddb2262
files libinterp/corefcn/cellfun.cc libinterp/corefcn/data.cc libinterp/corefcn/xpow.cc libinterp/octave-value/ov-cell.cc libinterp/octave-value/ov-flt-re-mat.cc libinterp/octave-value/ov-re-mat.cc liboctave/array/Array.h liboctave/array/CMatrix.cc liboctave/array/CRowVector.cc liboctave/array/Sparse.cc liboctave/array/dMatrix.cc liboctave/array/dRowVector.cc liboctave/array/fCMatrix.cc liboctave/array/fCRowVector.cc liboctave/array/fMatrix.cc liboctave/array/fRowVector.cc
diffstat 16 files changed, 91 insertions(+), 115 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/cellfun.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/libinterp/corefcn/cellfun.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -1925,7 +1925,7 @@
 static Cell
 do_mat2cell_2d (const Array2D& a, const Array<octave_idx_type> *d, int nd)
 {
-  NoAlias<Cell> retval;
+  Cell retval;
   assert (nd == 1 || nd == 2);
   assert (a.ndims () == 2);
 
@@ -1950,7 +1950,7 @@
       for (octave_idx_type i = 0; i < nidx; i++)
         {
           octave_idx_type u = l + d[ivec](i);
-          retval(i) = a.index (idx_vector (l, u));
+          retval.xelem (i) = a.index (idx_vector (l, u));
           l = u;
         }
     }
@@ -1968,7 +1968,7 @@
           {
             octave_quit ();
 
-            retval(i,j) = a.index (ridx[i], cidx[j]);
+            retval.xelem (i,j) = a.index (ridx[i], cidx[j]);
           }
     }
 
@@ -1982,7 +1982,7 @@
 Cell
 do_mat2cell_nd (const ArrayND& a, const Array<octave_idx_type> *d, int nd)
 {
-  NoAlias<Cell> retval;
+  Cell retval;
   assert (nd >= 1);
 
   if (mat2cell_mismatch (a.dims (), d, nd))
@@ -2011,7 +2011,7 @@
     }
 
   OCTAVE_LOCAL_BUFFER_INIT (octave_idx_type, ridx, nd, 0);
-  NoAlias< Array<idx_vector>> ra_idx
+  Array<idx_vector> ra_idx
     (dim_vector (1, std::max (nd, a.ndims ())), idx_vector::colon);
 
   for (octave_idx_type j = 0; j < retval.numel (); j++)
@@ -2019,9 +2019,9 @@
       octave_quit ();
 
       for (int i = 0; i < nd; i++)
-        ra_idx(i) = idx[i][ridx[i]];
+        ra_idx.xelem (i) = idx[i][ridx[i]];
 
-      retval(j) = a.index (ra_idx);
+      retval.xelem (j) = a.index (ra_idx);
 
       rdv.increment_index (ridx);
     }
@@ -2046,7 +2046,7 @@
 Cell
 do_mat2cell (octave_value& a, const Array<octave_idx_type> *d, int nd)
 {
-  NoAlias<Cell> retval;
+  Cell retval;
   assert (nd >= 1);
 
   if (mat2cell_mismatch (a.dims (), d, nd))
@@ -2085,7 +2085,7 @@
       for (int i = 0; i < nd; i++)
         ra_idx(i) = idx[i][ridx[i]];
 
-      retval(j) = a.do_index_op (ra_idx);
+      retval.xelem (j) = a.do_index_op (ra_idx);
 
       rdv.increment_index (ridx);
     }
@@ -2285,7 +2285,7 @@
                             || (dim == 1 && array.rows () == 1)))
     {
       for (octave_idx_type i = 0; i < n; i++)
-        retval(i) = array.index (idx_vector (lb(i) - 1, ub(i)));
+        retval.xelem (i) = array.index (idx_vector (lb(i) - 1, ub(i)));
     }
   else
     {
@@ -2300,7 +2300,7 @@
       for (octave_idx_type i = 0; i < n; i++)
         {
           idx(dim) = idx_vector (lb(i) - 1, ub(i));
-          retval(i) = array.index (idx);
+          retval.xelem (i) = array.index (idx);
         }
     }
 
@@ -2420,7 +2420,7 @@
       for (octave_idx_type i = 0; i < n; i++)
         {
           idx(dim) = Range (lb(i), ub(i));
-          retcell(i) = x.do_index_op (idx);
+          retcell.xelem (i) = x.do_index_op (idx);
         }
     }
 
@@ -2461,7 +2461,7 @@
 
   const Cell x = args(0).xcell_value ("cellindexmat: X must be a cell");
 
-  NoAlias<Cell> y (x.dims ());
+  Cell y (x.dims ());
   octave_idx_type nel = x.numel ();
   octave_value_list idx = args.slice (1, args.length () - 1);
 
@@ -2471,7 +2471,7 @@
 
       octave_value tmp = x(i);
 
-      y(i) = tmp.do_index_op (idx);
+      y.xelem (i) = tmp.do_index_op (idx);
     }
 
   return octave_value (y);
--- a/libinterp/corefcn/data.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/libinterp/corefcn/data.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -2722,10 +2722,10 @@
         {
           int ndims = dimensions.ndims ();
 
-          NoAlias<Matrix> m (1, ndims);
+          Matrix m (1, ndims);
 
           for (int i = 0; i < ndims; i++)
-            m(i) = dimensions(i);
+            m.xelem (i) = dimensions(i);
 
           retval(0) = m;
         }
@@ -7887,7 +7887,7 @@
 
   octave_value x = args(0);
 
-  NoAlias< Array<octave_idx_type>> r (rm.dims ());
+  Array<octave_idx_type> r (rm.dims ());
 
   for (octave_idx_type i = 0; i < rm.numel (); i++)
     {
@@ -7895,7 +7895,7 @@
       if (static_cast<double> (rx) != rm(i))
         error ("repelems: R must be a matrix of integers");
 
-      r(i) = rx;
+      r.xelem (i) = rx;
     }
 
   switch (x.builtin_type ())
--- a/libinterp/corefcn/xpow.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/libinterp/corefcn/xpow.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -1192,30 +1192,30 @@
     }
   else
     {
-      NoAlias<NDArray> result (a.dims ());
+      NDArray result (a.dims ());
 
       int ib = static_cast<int> (b);
       if (ib == 2)
         {
           for (octave_idx_type i = 0; i < a.numel (); i++)
-            result(i) = a(i) * a(i);
+            result.xelem (i) = a(i) * a(i);
         }
       else if (ib == 3)
         {
           for (octave_idx_type i = 0; i < a.numel (); i++)
-            result(i) = a(i) * a(i) * a(i);
+            result.xelem (i) = a(i) * a(i) * a(i);
         }
       else if (ib == -1)
         {
           for (octave_idx_type i = 0; i < a.numel (); i++)
-            result(i) = 1.0 / a(i);
+            result.xelem (i) = 1.0 / a(i);
         }
       else
         {
           for (octave_idx_type i = 0; i < a.numel (); i++)
             {
               octave_quit ();
-              result(i) = std::pow (a(i), ib);
+              result.xelem (i) = std::pow (a(i), ib);
             }
         }
 
@@ -2501,30 +2501,30 @@
     }
   else
     {
-      NoAlias<FloatNDArray> result (a.dims ());
+      FloatNDArray result (a.dims ());
 
       int ib = static_cast<int> (b);
       if (ib == 2)
         {
           for (octave_idx_type i = 0; i < a.numel (); i++)
-            result(i) = a(i) * a(i);
+            result.xelem (i) = a(i) * a(i);
         }
       else if (ib == 3)
         {
           for (octave_idx_type i = 0; i < a.numel (); i++)
-            result(i) = a(i) * a(i) * a(i);
+            result.xelem (i) = a(i) * a(i) * a(i);
         }
       else if (ib == -1)
         {
           for (octave_idx_type i = 0; i < a.numel (); i++)
-            result(i) = 1.0f / a(i);
+            result.xelem (i) = 1.0f / a(i);
         }
       else
         {
           for (octave_idx_type i = 0; i < a.numel (); i++)
             {
               octave_quit ();
-              result(i) = std::pow (a(i), ib);
+              result.xelem (i) = std::pow (a(i), ib);
             }
         }
 
--- a/libinterp/octave-value/ov-cell.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/libinterp/octave-value/ov-cell.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -1382,7 +1382,7 @@
   for (int i = 1; i < result_dv.ndims (); i++)
     result_dv(i) = m_dv(i-1);
 
-  NoAlias<Cell> c (result_dv);
+  Cell c (result_dv);
 
   octave_idx_type n_elts = m.numel ();
 
@@ -1390,7 +1390,7 @@
   // we don't need a key lookup at all.
   for (octave_idx_type j = 0; j < n_elts; j++)
     for (octave_idx_type i = 0; i < num_fields; i++)
-      c(i,j) = m.contents(i)(j);
+      c.xelem (i,j) = m.contents(i)(j);
 
   return ovl (c);
 }
--- a/libinterp/octave-value/ov-flt-re-mat.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/libinterp/octave-value/ov-flt-re-mat.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -738,7 +738,7 @@
 do_rc_map (const FloatNDArray& a, FloatComplex (&fcn) (float))
 {
   octave_idx_type n = a.numel ();
-  NoAlias<FloatNDArray> rr (a.dims ());
+  FloatNDArray rr (a.dims ());
 
   for (octave_idx_type i = 0; i < n; i++)
     {
@@ -746,21 +746,21 @@
 
       FloatComplex tmp = fcn (a(i));
       if (tmp.imag () == 0.0)
-        rr(i) = tmp.real ();
+        rr.xelem (i) = tmp.real ();
       else
         {
-          NoAlias<FloatComplexNDArray> rc (a.dims ());
+          FloatComplexNDArray rc (a.dims ());
 
           for (octave_idx_type j = 0; j < i; j++)
-            rc(j) = rr(j);
+            rc.xelem (j) = rr.xelem (j);
 
-          rc(i) = tmp;
+          rc.xelem (i) = tmp;
 
           for (octave_idx_type j = i+1; j < n; j++)
             {
               octave_quit ();
 
-              rc(j) = fcn (a(j));
+              rc.xelem (j) = fcn (a(j));
             }
 
           return new octave_float_complex_matrix (rc);
--- a/libinterp/octave-value/ov-re-mat.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/libinterp/octave-value/ov-re-mat.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -865,7 +865,7 @@
 do_rc_map (const NDArray& a, Complex (&fcn) (double))
 {
   octave_idx_type n = a.numel ();
-  NoAlias<NDArray> rr (a.dims ());
+  NDArray rr (a.dims ());
 
   for (octave_idx_type i = 0; i < n; i++)
     {
@@ -873,21 +873,21 @@
 
       Complex tmp = fcn (a(i));
       if (tmp.imag () == 0.0)
-        rr(i) = tmp.real ();
+        rr.xelem (i) = tmp.real ();
       else
         {
-          NoAlias<ComplexNDArray> rc (a.dims ());
+          ComplexNDArray rc (a.dims ());
 
           for (octave_idx_type j = 0; j < i; j++)
-            rc(j) = rr(j);
+            rc.xelem (j) = rr.xelem (j);
 
-          rc(i) = tmp;
+          rc.xelem (i) = tmp;
 
           for (octave_idx_type j = i+1; j < n; j++)
             {
               octave_quit ();
 
-              rc(j) = fcn (a(j));
+              rc.xelem (j) = fcn (a(j));
             }
 
           return new octave_complex_matrix (rc);
--- a/liboctave/array/Array.h	Sun Nov 10 21:56:18 2019 +0100
+++ b/liboctave/array/Array.h	Mon Sep 30 11:05:42 2019 +0200
@@ -877,30 +877,6 @@
   dimensions.chop_trailing_singletons ();
 }
 
-//! This is a simple wrapper template that will subclass an Array<T>
-//! type or any later type derived from it and override the default
-//! non-const operator() to not check for the array's uniqueness.  It
-//! is, however, the user's responsibility to ensure the array is
-//! actually unaliased whenever elements are accessed.
-template <typename ArrayClass>
-class NoAlias : public ArrayClass
-{
-  typedef typename ArrayClass::element_type T;
-public:
-  NoAlias () : ArrayClass () { }
-
-  using ArrayClass::ArrayClass;
-
-  T& operator () (octave_idx_type n)
-  { return ArrayClass::xelem (n); }
-  T& operator () (octave_idx_type i, octave_idx_type j)
-  { return ArrayClass::xelem (i, j); }
-  T& operator () (octave_idx_type i, octave_idx_type j, octave_idx_type k)
-  { return ArrayClass::xelem (i, j, k); }
-  T& operator () (const Array<octave_idx_type>& ra_idx)
-  { return ArrayClass::xelem (ra_idx); }
-};
-
 template <typename T>
 std::ostream&
 operator << (std::ostream& os, const Array<T>& a);
--- a/liboctave/array/CMatrix.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/liboctave/array/CMatrix.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -3610,7 +3610,7 @@
     (*current_liboctave_error_handler)
       ("linspace: vectors must be of equal length");
 
-  NoAlias<ComplexMatrix> retval;
+  ComplexMatrix retval;
 
   if (n < 1)
     {
@@ -3620,19 +3620,19 @@
 
   retval.clear (m, n);
   for (octave_idx_type i = 0; i < m; i++)
-    retval(i, 0) = x1(i);
+    retval.xelem (i, 0) = x1(i);
 
   // The last column is unused so temporarily store delta there
-  Complex *delta = &retval(0, n-1);
+  Complex *delta = &retval.xelem (0, n-1);
   for (octave_idx_type i = 0; i < m; i++)
     delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1.0);
 
   for (octave_idx_type j = 1; j < n-1; j++)
     for (octave_idx_type i = 0; i < m; i++)
-      retval(i, j) = x1(i) + static_cast<double> (j)*delta[i];
+      retval.xelem (i, j) = x1(i) + static_cast<double> (j)*delta[i];
 
   for (octave_idx_type i = 0; i < m; i++)
-    retval(i, n-1) = x2(i);
+    retval.xelem (i, n-1) = x2(i);
 
   return retval;
 }
--- a/liboctave/array/CRowVector.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/liboctave/array/CRowVector.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -424,7 +424,7 @@
 ComplexRowVector
 linspace (const Complex& x1, const Complex& x2, octave_idx_type n_in)
 {
-  NoAlias<ComplexRowVector> retval;
+  ComplexRowVector retval;
 
   if (n_in < 1)
     return retval;
@@ -442,19 +442,19 @@
 
   // Set endpoints, rather than calculate, for maximum accuracy.
   retval.clear (n);
-  retval(0) = x1;
-  retval(n-1) = x2;
+  retval.xelem (0) = x1;
+  retval.xelem (n-1) = x2;
 
   // Construct linspace symmetrically from both ends.
   Complex delta = (x2 - x1) / (n - 1.0);
   unsigned_octave_idx_type n2 = n/2;
   for (unsigned_octave_idx_type i = 1; i < n2; i++)
     {
-      retval(i) = x1 + static_cast<double> (i)*delta;
-      retval(n-1-i) = x2 - static_cast<double> (i)*delta;
+      retval.xelem (i) = x1 + static_cast<double> (i)*delta;
+      retval.xelem (n-1-i) = x2 - static_cast<double> (i)*delta;
     }
   if (n % 2 == 1)  // Middle element if number of elements is odd.
-    retval(n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2.0);
+    retval.xelem (n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2.0);
 
   return retval;
 }
--- a/liboctave/array/Sparse.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/liboctave/array/Sparse.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -1507,9 +1507,9 @@
 
           // Lookup.
           // FIXME: Could specialize for sorted idx?
-          NoAlias< Array<octave_idx_type>> lidx (dim_vector (new_nr, new_nc));
+          Array<octave_idx_type> lidx (dim_vector (new_nr, new_nc));
           for (octave_idx_type i = 0; i < new_nr*new_nc; i++)
-            lidx(i) = lblookup (ridx (), nz, idxa(i));
+            lidx.xelem (i) = lblookup (ridx (), nz, idxa(i));
 
           // Count matches.
           retval = Sparse<T> (idxa.rows (), idxa.cols ());
@@ -1518,11 +1518,11 @@
               octave_idx_type nzj = 0;
               for (octave_idx_type i = 0; i < new_nr; i++)
                 {
-                  octave_idx_type l = lidx(i, j);
+                  octave_idx_type l = lidx.xelem (i, j);
                   if (l < nz && ridx (l) == idxa(i, j))
                     nzj++;
                   else
-                    lidx(i, j) = nz;
+                    lidx.xelem (i, j) = nz;
                 }
               retval.xcidx (j+1) = retval.xcidx (j) + nzj;
             }
@@ -1534,7 +1534,7 @@
           for (octave_idx_type j = 0; j < new_nc; j++)
             for (octave_idx_type i = 0; i < new_nr; i++)
               {
-                octave_idx_type l = lidx(i, j);
+                octave_idx_type l = lidx.xelem (i, j);
                 if (l < nz)
                   {
                     retval.data (k) = data (l);
--- a/liboctave/array/dMatrix.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/liboctave/array/dMatrix.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -3002,7 +3002,7 @@
     (*current_liboctave_error_handler)
       ("linspace: vectors must be of equal length");
 
-  NoAlias<Matrix> retval;
+  Matrix retval;
 
   if (n < 1)
     {
@@ -3012,19 +3012,19 @@
 
   retval.clear (m, n);
   for (octave_idx_type i = 0; i < m; i++)
-    retval(i, 0) = x1(i);
+    retval.xelem (i, 0) = x1(i);
 
   // The last column is unused so temporarily store delta there
-  double *delta = &retval(0, n-1);
+  double *delta = &retval.xelem (0, n-1);
   for (octave_idx_type i = 0; i < m; i++)
     delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1);
 
   for (octave_idx_type j = 1; j < n-1; j++)
     for (octave_idx_type i = 0; i < m; i++)
-      retval(i, j) = x1(i) + j*delta[i];
+      retval.xelem (i, j) = x1(i) + j*delta[i];
 
   for (octave_idx_type i = 0; i < m; i++)
-    retval(i, n-1) = x2(i);
+    retval.xelem (i, n-1) = x2(i);
 
   return retval;
 }
--- a/liboctave/array/dRowVector.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/liboctave/array/dRowVector.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -267,7 +267,7 @@
 RowVector
 linspace (double x1, double x2, octave_idx_type n_in)
 {
-  NoAlias<RowVector> retval;
+  RowVector retval;
 
   if (n_in < 1)
     return retval;
@@ -285,19 +285,19 @@
 
   // Set endpoints, rather than calculate, for maximum accuracy.
   retval.clear (n);
-  retval(0) = x1;
-  retval(n-1) = x2;
+  retval.xelem (0) = x1;
+  retval.xelem (n-1) = x2;
 
   // Construct linspace symmetrically from both ends.
   double delta = (x2 - x1) / (n - 1);
   unsigned_octave_idx_type n2 = n/2;
   for (unsigned_octave_idx_type i = 1; i < n2; i++)
     {
-      retval(i) = x1 + i*delta;
-      retval(n-1-i) = x2 - i*delta;
+      retval.xelem (i) = x1 + i*delta;
+      retval.xelem (n-1-i) = x2 - i*delta;
     }
   if (n % 2 == 1)  // Middle element if number of elements is odd.
-    retval(n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2);
+    retval.xelem (n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2);
 
   return retval;
 }
--- a/liboctave/array/fCMatrix.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/liboctave/array/fCMatrix.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -3641,7 +3641,7 @@
     (*current_liboctave_error_handler)
       ("linspace: vectors must be of equal length");
 
-  NoAlias<FloatComplexMatrix> retval;
+  FloatComplexMatrix retval;
 
   if (n < 1)
     {
@@ -3651,19 +3651,19 @@
 
   retval.clear (m, n);
   for (octave_idx_type i = 0; i < m; i++)
-    retval(i, 0) = x1(i);
+    retval.xelem (i, 0) = x1(i);
 
   // The last column is unused so temporarily store delta there
-  FloatComplex *delta = &retval(0, n-1);
+  FloatComplex *delta = &retval.xelem (0, n-1);
   for (octave_idx_type i = 0; i < m; i++)
     delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1.0f);
 
   for (octave_idx_type j = 1; j < n-1; j++)
     for (octave_idx_type i = 0; i < m; i++)
-      retval(i, j) = x1(i) + static_cast<float> (j)*delta[i];
+      retval.xelem (i, j) = x1(i) + static_cast<float> (j)*delta[i];
 
   for (octave_idx_type i = 0; i < m; i++)
-    retval(i, n-1) = x2(i);
+    retval.xelem (i, n-1) = x2(i);
 
   return retval;
 }
--- a/liboctave/array/fCRowVector.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/liboctave/array/fCRowVector.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -426,7 +426,7 @@
 FloatComplexRowVector
 linspace (const FloatComplex& x1, const FloatComplex& x2, octave_idx_type n_in)
 {
-  NoAlias<FloatComplexRowVector> retval;
+  FloatComplexRowVector retval;
 
   if (n_in < 1)
     return retval;
@@ -444,19 +444,19 @@
 
   // Set endpoints, rather than calculate, for maximum accuracy.
   retval.clear (n);
-  retval(0) = x1;
-  retval(n-1) = x2;
+  retval.xelem (0) = x1;
+  retval.xelem (n-1) = x2;
 
   // Construct linspace symmetrically from both ends.
   FloatComplex delta = (x2 - x1) / (n - 1.0f);
   unsigned_octave_idx_type n2 = n/2;
   for (unsigned_octave_idx_type i = 1; i < n2; i++)
     {
-      retval(i) = x1 + static_cast<float> (i)*delta;
-      retval(n-1-i) = x2 - static_cast<float> (i)*delta;
+      retval.xelem (i) = x1 + static_cast<float> (i)*delta;
+      retval.xelem (n-1-i) = x2 - static_cast<float> (i)*delta;
     }
   if (n % 2 == 1)  // Middle element if number of elements is odd.
-    retval(n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2.0f);
+    retval.xelem (n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2.0f);
 
   return retval;
 }
--- a/liboctave/array/fMatrix.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/liboctave/array/fMatrix.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -3008,7 +3008,7 @@
     (*current_liboctave_error_handler)
       ("linspace: vectors must be of equal length");
 
-  NoAlias<FloatMatrix> retval;
+  FloatMatrix retval;
 
   if (n < 1)
     {
@@ -3018,19 +3018,19 @@
 
   retval.clear (m, n);
   for (octave_idx_type i = 0; i < m; i++)
-    retval(i, 0) = x1(i);
+    retval.xelem (i, 0) = x1(i);
 
   // The last column is unused so temporarily store delta there
-  float *delta = &retval(0, n-1);
+  float *delta = &retval.xelem (0, n-1);
   for (octave_idx_type i = 0; i < m; i++)
     delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1);
 
   for (octave_idx_type j = 1; j < n-1; j++)
     for (octave_idx_type i = 0; i < m; i++)
-      retval(i, j) = x1(i) + j*delta[i];
+      retval.xelem (i, j) = x1(i) + j*delta[i];
 
   for (octave_idx_type i = 0; i < m; i++)
-    retval(i, n-1) = x2(i);
+    retval.xelem (i, n-1) = x2(i);
 
   return retval;
 }
--- a/liboctave/array/fRowVector.cc	Sun Nov 10 21:56:18 2019 +0100
+++ b/liboctave/array/fRowVector.cc	Mon Sep 30 11:05:42 2019 +0200
@@ -267,7 +267,7 @@
 FloatRowVector
 linspace (float x1, float x2, octave_idx_type n_in)
 {
-  NoAlias<FloatRowVector> retval;
+  FloatRowVector retval;
 
   if (n_in < 1)
     return retval;
@@ -285,19 +285,19 @@
 
   // Set endpoints, rather than calculate, for maximum accuracy.
   retval.clear (n);
-  retval(0) = x1;
-  retval(n-1) = x2;
+  retval.xelem (0) = x1;
+  retval.xelem (n-1) = x2;
 
   // Construct linspace symmetrically from both ends.
   float delta = (x2 - x1) / (n - 1);
   unsigned_octave_idx_type n2 = n/2;
   for (unsigned_octave_idx_type i = 1; i < n2; i++)
     {
-      retval(i) = x1 + i*delta;
-      retval(n-1-i) = x2 - i*delta;
+      retval.xelem (i) = x1 + i*delta;
+      retval.xelem (n-1-i) = x2 - i*delta;
     }
   if (n % 2 == 1)  // Middle element if number of elements is odd.
-    retval(n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2);
+    retval.xelem (n2) = (x1 == -x2 ? 0 : (x1 + x2) / 2);
 
   return retval;
 }