diff libinterp/octave-value/ov.cc @ 21990:efce657ceb86

Provide a warning when an array is used in an if/while/until (bug #43098). * errwarn.{cc,h} (warn_array_as_logical, reset_first_array_as_logical_since_keyboard): New functions * error.cc (initialize_default_warning_state): Disable Octave:array-as-logical by default * warning_ids.m: Add new warning Octave:array-as-logical. * input.cc (interactive_input): Reset first_array_as_logical_since_keyboard. * ov-base-mat.cc (octave_base_matrix<MT>::is_true): Call warn_array_as_logical if > 1x1. * ov-base-diag.cc (octave_base_diag<DMT, MT>::is_true): Call warn_array_as_logical if > 1x1. Optimise calculation. * ov-perm.cc (octave_perm_matrix::do_index_op): Call warn_array_as_logical if > 1x1. Optimise calculation. * ov-range.cc (octave_range::is_true): Call warn_array_as_logical if > 1x1. Optimise calculation. * ov-base-sparse (octave_base_sparse<T>::is_true) Call warn_array_as_logical if > 1x1. Check for NaN/NA. * Sparse.cc (Sparse<T>::SparseRep::any_element_is_nan): New function. * Sparse.h (Sparse<T>::SparseRep::any_element_is_nan, Sparse<T>::any_element_is_nan): New functions. * Sparse-b.cc (Sparse<bool>::SparseRep::any_element_is_nan): New function, specialization of the above. * if.tst: New built-in self tests.
author Lachlan Andrew <lachlanbis@gmail.com>
date Wed, 29 Jun 2016 08:50:09 -0700
parents 112b20240c87
children e43d83253e28
line wrap: on
line diff
--- a/libinterp/octave-value/ov.cc	Tue Jun 28 16:42:15 2016 -0400
+++ b/libinterp/octave-value/ov.cc	Wed Jun 29 08:50:09 2016 -0700
@@ -1411,7 +1411,17 @@
 
       // Empty array also means a match.
       if (tmp.is_defined ())
-        retval = tmp.is_true () || tmp.is_empty ();
+        {
+          if (tmp.is_empty ())
+            retval = true;
+          else
+            {
+              // Reshape into a vector and call all() explicitly,
+              // to avoid Octave:array-as-logical warning.
+              tmp = tmp.reshape (dim_vector (tmp.numel (), 1));
+              retval = tmp.all ().is_true ();
+            }
+        }
     }
 
   return retval;