[ast] limit occurences of argn(0)==0 to improve backward compatibility 58/21258/5
St├ęphane Mottelet [Fri, 24 Jan 2020 17:23:15 +0000 (18:23 +0100)]
Since https://codereview.scilab.org/#/c/21034/ when a macro
was called without output arguments, the value argn(0)==0 is given
without restriction and this can break a lot of user codes checking
the number of output arguments with constructs like

if argn(0) <> 1, ..., end

instead of

if argn(0) > 1, ..., end

With this patch, argn(0)==0 is only granted when macro prototype has
no formal output argument or if varargout is the only formal output
argument.

Change-Id: Ifc235a2ac986550b41522fddbf448b6eaa02b2d3

scilab/modules/ast/src/cpp/types/macro.cpp

index ccd4f4c..9b6599e 100644 (file)
@@ -291,6 +291,14 @@ Callable::ReturnValue Macro::call(typed_list &in, optional_list &opt, int _iRetC
         pContext->put(m_Varargout, pL);
     }
 
+    // iRetCount = 0 is granted to the macro (as argn(0))
+    // when there is no formal output argument
+    // or if varargout is the only formal output argument.
+    if ( m_outputArgs->size() - (bVarargout ? 1 : 0) >= 1 )
+    {
+        iRetCount = std::max(1, iRetCount);
+    }
+
     //common part with or without varargin/varargout
 
     // Declare nargin & nargout in function context.