diff libinterp/corefcn/xpow.cc @ 29389:85998370816a

Return empty matrix when using an empty matrix as base or exponent in '^' operator (bug #68006). * xpow.cc: Change all input validation to detect empty matrix (nrows == 0 || ncols == 0) as either base or exponent and return an empty matrix of the appropriate type (Matrix for double or FloatMatrix for single).
author Rik <rik@octave.org>
date Mon, 22 Feb 2021 16:07:49 -0800
parents 7854d5752dd2
children 540f25090412
line wrap: on
line diff
--- a/libinterp/corefcn/xpow.cc	Mon Feb 22 11:55:23 2021 +0900
+++ b/libinterp/corefcn/xpow.cc	Mon Feb 22 16:07:49 2021 -0800
@@ -119,7 +119,10 @@
   octave_idx_type nr = b.rows ();
   octave_idx_type nc = b.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return Matrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   try
@@ -170,7 +173,10 @@
   octave_idx_type nr = b.rows ();
   octave_idx_type nc = b.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return Matrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   EIG b_eig (b);
@@ -209,7 +215,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return Matrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   if (xisint (b))
@@ -295,7 +304,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return Matrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   if (xisint (b))
@@ -335,7 +347,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return Matrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   EIG a_eig (a);
@@ -383,7 +398,10 @@
   octave_idx_type nr = b.rows ();
   octave_idx_type nc = b.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return Matrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   EIG b_eig (b);
@@ -431,7 +449,10 @@
   octave_idx_type nr = b.rows ();
   octave_idx_type nc = b.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return Matrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   EIG b_eig (b);
@@ -470,7 +491,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return Matrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   if (xisint (b))
@@ -556,7 +580,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return Matrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   EIG a_eig (a);
@@ -590,7 +617,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return Matrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   ComplexDiagMatrix r (nr, nc);
@@ -1522,7 +1552,10 @@
   octave_idx_type nr = b.rows ();
   octave_idx_type nc = b.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return FloatMatrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   FloatEIG b_eig (b);
@@ -1574,7 +1607,10 @@
   octave_idx_type nr = b.rows ();
   octave_idx_type nc = b.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return FloatMatrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   FloatEIG b_eig (b);
@@ -1613,7 +1649,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return FloatMatrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   if (xisint (b))
@@ -1699,7 +1738,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return FloatMatrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   if (xisint (b))
@@ -1729,7 +1771,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return FloatMatrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   FloatEIG a_eig (a);
@@ -1777,7 +1822,10 @@
   octave_idx_type nr = b.rows ();
   octave_idx_type nc = b.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return FloatMatrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   FloatEIG b_eig (b);
@@ -1825,7 +1873,10 @@
   octave_idx_type nr = b.rows ();
   octave_idx_type nc = b.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return FloatMatrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   FloatEIG b_eig (b);
@@ -1864,7 +1915,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return FloatMatrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   if (xisint (b))
@@ -1950,7 +2004,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return FloatMatrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   FloatEIG a_eig (a);
@@ -1984,7 +2041,10 @@
   octave_idx_type nr = a.rows ();
   octave_idx_type nc = a.cols ();
 
-  if (nr == 0 || nc == 0 || nr != nc)
+  if (nr == 0 || nc == 0)
+    return FloatMatrix ();
+
+  if (nr != nc)
     err_nonsquare_matrix ();
 
   FloatComplexDiagMatrix r (nr, nc);