changeset 30285:fca639cb78b8

detect fcn called with too many args when arg list not present (bug #61471) * pt-eval.cc (tree_evaluator::define_parameter_list_from_arg_vector): Check for valid param_list here. (tree_evaluator::execute_user_function): Not here. Also check for function call with too many arguments when param_list is nullptr.
author John W. Eaton <jwe@octave.org>
date Fri, 12 Nov 2021 15:16:05 -0500
parents 4aa5b391f0d3
children b8a8abd1b1ba
files libinterp/parse-tree/pt-eval.cc
diffstat 1 files changed, 17 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/parse-tree/pt-eval.cc	Fri Nov 12 13:39:40 2021 -0500
+++ b/libinterp/parse-tree/pt-eval.cc	Fri Nov 12 15:16:05 2021 -0500
@@ -2199,6 +2199,9 @@
   tree_evaluator::define_parameter_list_from_arg_vector
     (tree_parameter_list *param_list, const octave_value_list& args)
   {
+    if (! param_list || param_list->varargs_only ())
+      return;
+
     int i = -1;
 
     for (tree_decl_elt *elt : *param_list)
@@ -3395,21 +3398,24 @@
 
     tree_parameter_list *param_list = user_function.parameter_list ();
 
+    bool takes_varargs = false;
+    int max_inputs = 0;
+
     if (param_list)
       {
-        int max_inputs = param_list->length ();
-
-        if (! param_list->takes_varargs () && nargin > max_inputs)
-          {
-            std::string name = user_function.name ();
-
-            error ("%s: function called with too many inputs", name.c_str ());
-          }
-
-        if (! param_list->varargs_only ())
-          define_parameter_list_from_arg_vector (param_list, args);
+        takes_varargs = param_list->takes_varargs ();
+        max_inputs = param_list->length ();
       }
 
+    if (! takes_varargs && nargin > max_inputs)
+      {
+        std::string name = user_function.name ();
+
+        error ("%s: function called with too many inputs", name.c_str ());
+      }
+
+    define_parameter_list_from_arg_vector (param_list, args);
+
     tree_parameter_list *ret_list = user_function.return_list ();
 
     if (ret_list && ! ret_list->takes_varargs ())