bug #14573: varargout misworked when it was used in addition to fixed output arguments 25/19725/4
Antoine ELIAS [Tue, 6 Feb 2018 08:38:30 +0000 (09:38 +0100)]
CHANCES is already updated

Change-Id: I0c23fb54a46f36cf814e6ff5b70378727e49b7e2

scilab/modules/ast/src/cpp/types/macro.cpp
scilab/modules/core/tests/nonreg_tests/bug_14573.tst [new file with mode: 0644]
scilab/modules/core/tests/unit_tests/varargout.dia.ref [deleted file]
scilab/modules/core/tests/unit_tests/varargout.tst

index e1cfc8f..47c6657 100644 (file)
@@ -232,7 +232,7 @@ Callable::ReturnValue Macro::call(typed_list &in, optional_list &opt, int _iRetC
             }
         }
 
-        //add varargin to macro scope 
+        //add varargin to macro scope
         pContext->put(m_Varargin, pL);
     }
     else if (rhs > m_inputArgs->size())
@@ -387,15 +387,17 @@ Callable::ReturnValue Macro::call(typed_list &in, optional_list &opt, int _iRetC
             return Callable::Error;
         }
 
-        if (pOut->isList() == false || pOut->getAs<List>()->getSize() == 0)
+        if (pOut->isList() == false)
         {
             cleanCall(pContext, oldVal);
-            Scierror(999, _("Invalid index.\n"));
+            char* pstMacroName = wide_string_to_UTF8(getName().c_str());
+            Scierror(999, _("%s: Wrong type for %s: A list expected.\n"), pstMacroName, "Varargout");
+            FREE(pstMacroName);
             return Callable::Error;
         }
 
         List* pVarOut = pOut->getAs<List>();
-        const int size = std::min(pVarOut->getSize(), _iRetCount);
+        const int size = std::min(pVarOut->getSize(), _iRetCount - (int)out.size());
         for (int i = 0 ; i < size ; ++i)
         {
             InternalType* pIT = pVarOut->get(i);
diff --git a/scilab/modules/core/tests/nonreg_tests/bug_14573.tst b/scilab/modules/core/tests/nonreg_tests/bug_14573.tst
new file mode 100644 (file)
index 0000000..f06ffea
--- /dev/null
@@ -0,0 +1,63 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - ESI - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 14573 -->
+//
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14573
+//
+// <-- Short Description -->
+// varargout misworked when it was used in addition to fixed output arguments.
+
+//1 var + varargout
+function [res, varargout] = test(a)
+  res = "abc";
+  varargout = list(%i);
+endfunction
+
+r = test();
+assert_checkequal(r, "abc");
+
+r = test(4.321);
+assert_checkequal(r, "abc");
+
+[r1, r2] = test(%pi);
+assert_checkequal(r, "abc");
+assert_checkequal(r2, %i);
+
+err = execstr("[o1, o2, o3] = test(%pi);", "errcatch");
+assert_checkfalse(err == 0);
+
+
+//2 vars + varargout
+function [res1, res2, varargout] = test2(a)
+  res1 = "abc";
+  res2 = "def";
+  varargout = list(%i);
+endfunction
+
+r = test2();
+assert_checkequal(r, "abc");
+
+r = test2(4.321);
+assert_checkequal(r, "abc");
+
+[r1, r2] = test2(%pi);
+assert_checkequal(r1, "abc");
+assert_checkequal(r2, "def");
+
+[r1, r2, r3] = test2(%pi);
+assert_checkequal(r1, "abc");
+assert_checkequal(r2, "def");
+assert_checkequal(r3, %i);
+
+err = execstr("[r1, r2, r3, r4] = test2(%pi);", "errcatch");
+assert_checkfalse(err == 0);
diff --git a/scilab/modules/core/tests/unit_tests/varargout.dia.ref b/scilab/modules/core/tests/unit_tests/varargout.dia.ref
deleted file mode 100644 (file)
index 0db920a..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-//<-- CLI SHELL MODE -->
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2011 - DIGITEO - Bruno JOFRET
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-//
-// Return 3 values
-//
-function varargout=__test_function__()
-  varargout(1) = 42;
-  varargout(2) = "value";
-  varargout(3) = list(51);
-endfunction
-// Simple call
-__test_function__();
-a = __test_function__();
-if a <> 42 then bugmes();quit;end;
-clear a;
-[a,b] = __test_function__();
-if a <> 42 then bugmes();quit;end;
-if b <> "value" then bugmes();quit;end;
-clear a;
-clear b;
-[a,b,c] = __test_function__();
-if a <> 42 then bugmes();quit;end;
-if b <> "value" then bugmes();quit;end;
-if c <> list(51) then bugmes();quit;end;
-clear a;
-clear b;
-clear c;
-// Check call with too much output values.
-ierr = execstr("[a,b,c,d] = __test_function__();", "errcatch");
-assert_checkfalse(ierr == 0);
-//
-// Return a list of 3 elements with second missing.
-//
-function varargout=__test_function2__()
-  varargout(1) = 42;
-  varargout(3) = "value";
-endfunction
-// Simple call
-__test_function2__();
-a = __test_function2__();
-if a <> 42 then bugmes();quit;end;
-clear a;
-// varargout(2) is undefined
-ierr = execstr("[a,b] = __test_function2__();", "errcatch");
-assert_checkfalse(ierr == 0);
-//
-// varargout is not set : should not work.
-//
-function varargout=__test_function3__()
-endfunction
-ierr = execstr("__test_function3__();", "errcatch");
-assert_checkfalse(ierr == 0);
index 9c2cc06..6a19ec9 100644 (file)
@@ -1,11 +1,12 @@
-//<-- CLI SHELL MODE -->
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2011 - DIGITEO - Bruno JOFRET
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
-
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 //
 // Return 3 values
 //
@@ -59,11 +60,18 @@ clear a;
 ierr = execstr("[a,b] = __test_function2__();", "errcatch");
 assert_checkfalse(ierr == 0);
 
-//
-// varargout is not set : should not work.
-//
+// empty list
 function varargout=__test_function3__()
+  varargout = list();
 endfunction
 
-ierr = execstr("__test_function3__();", "errcatch");
-assert_checkfalse(ierr == 0);
+msg = msprintf(_("%s: Wrong number of output argument(s): %d expected.\n"), "__test_function3__", 0);
+assert_checkerror("a = __test_function3__()", msg);
+
+// wrong varargout type
+function varargout=__test_function4__()
+  varargout = 42;
+endfunction
+
+msg = msprintf(_("%s: Wrong type for %s: A list expected.\n"), "__test_function4__", "Varargout");
+assert_checkerror("__test_function4__()", msg);
\ No newline at end of file