[bug_14398] Bad expected size on output argument of optional input 65/17965/3
Cedric Delamarre [Wed, 23 Mar 2016 13:19:59 +0000 (14:19 +0100)]
test_run ast bug_14398

Change-Id: Id29e155ef9afdd2fa3127dc6daf6fd7b302b6092

scilab/CHANGES
scilab/modules/ast/src/cpp/ast/run_CallExp.hpp
scilab/modules/ast/tests/nonreg_tests/bug_14398.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/nonreg_tests/bug_14398.tst [new file with mode: 0644]

index 0e36796..6e6e8cf 100644 (file)
@@ -365,6 +365,8 @@ In 6.0.0:
 
 * Bug #14396 fixed - real number display was not proper for very wide decimal parts
 
+* Bug #14398 fixed - Matrix extraction was mistakenly considered a function call in calling sequence
+
 * Bug #14415 fixed - Corrected some spellings error in help pages
 
 * Bug #14416 fixed - The file extension filter in Scinotes "Save as" window did not re-used the active file's extension when applicable.
index 60e4d5c..0f7eb98 100644 (file)
@@ -34,6 +34,7 @@ void RunVisitorT<T>::visitprivate(const CallExp &e)
     {
         for (auto& arg : args)
         {
+            int iSize = getExpectedSize();
             if (arg->isAssignExp())
             {
                 AssignExp* pAssign = static_cast<AssignExp*>(arg);
@@ -49,6 +50,8 @@ void RunVisitorT<T>::visitprivate(const CallExp &e)
 
                 SimpleVar* pVar = pL->getAs<SimpleVar>();
                 Exp* pR = &pAssign->getRightExp();
+                // optional parameter have only one output argument
+                setExpectedSize(1);
                 try
                 {
                     pR->accept(*this);
@@ -58,6 +61,7 @@ void RunVisitorT<T>::visitprivate(const CallExp &e)
                     CoverageInstance::stopChrono((void*)&e);
                     throw;
                 }
+                setExpectedSize(iSize);
                 types::InternalType* pITR = getResult();
                 // IncreaseRef to protect opt argument of scope_end delete
                 // It will be deleted by clear_opt
@@ -71,7 +75,6 @@ void RunVisitorT<T>::visitprivate(const CallExp &e)
                 continue;
             }
 
-            int iSize = getExpectedSize();
             setExpectedSize(-1);
             try
             {
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14398.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_14398.dia.ref
new file mode 100644 (file)
index 0000000..0108119
--- /dev/null
@@ -0,0 +1,24 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14398 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14398
+//
+// <-- Short Description -->
+//
+// Array mistaken for a function call in calling sequence
+x = zeros(1,10);
+y = x;
+function [a, b] = F(x1, y1)
+  a = 0;
+  b = 0;
+endfunction
+err = execstr("[a, b] = F(x, y1=y(1:3));", "errcatch");
+assert_checkequal(err, 0);
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14398.tst b/scilab/modules/ast/tests/nonreg_tests/bug_14398.tst
new file mode 100644 (file)
index 0000000..fb9ec37
--- /dev/null
@@ -0,0 +1,27 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2016 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14398 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14398
+//
+// <-- Short Description -->
+//
+// Array mistaken for a function call in calling sequence
+
+x = zeros(1,10);
+y = x;
+
+function [a, b] = F(x1, y1)
+    a = 0;
+    b = 0;
+endfunction
+
+err = execstr("[a, b] = F(x, y1=y(1:3));", "errcatch");
+assert_checkequal(err, 0);