overload on matrix concatenation failed with [] 21/17221/2
Antoine ELIAS [Fri, 18 Sep 2015 14:24:38 +0000 (16:24 +0200)]
Change-Id: If3965f3041f2cf93259a75bc1f539bb37eed9782

scilab/CHANGES_6.0.X
scilab/modules/ast/src/cpp/ast/run_MatrixExp.hpp
scilab/modules/ast/tests/nonreg_tests/bug_14055.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/nonreg_tests/bug_14055.tst [new file with mode: 0644]

index cbe3500..caffdb7 100644 (file)
@@ -22,6 +22,8 @@ Scilab Bug Fixes
 
 * Bug #14059 fixed - Lack of performance on deletion of matrix elements.
 
+* Bug #14055 fixed - overload on matrix concatenation did not called with [].
+
 * Bug #14028 fixed - force flag of genlib did not rebuild bin file.
 
 * Bug #14024 fixed - Print of macrofile display a debug message
index c2790d6..b66cc5c 100644 (file)
@@ -132,23 +132,22 @@ void RunVisitorT<T>::visitprivate(const MatrixExp &e)
                 }
 
                 types::GenericType* pGT = pIT->getAs<types::GenericType>();
-                if (pGT->isDouble() && pGT->getAs<types::Double>()->isEmpty())
-                {
-                    pGT->killMe();
-                    continue;
-                }
 
                 if (poRow == NULL)
                 {
                     //first loop
+                    if (poResult == NULL && pGT->isDouble() && pGT->getAs<types::Double>()->isEmpty())
+                    {
+                        pGT->killMe();
+                        continue;
+                    }
+                    
                     poRow = pGT;
                     continue;
                 }
 
-                if (    pGT->isList() || poRow->isList() ||
-                        pGT->isStruct() || poRow->isStruct() ||
-                        poRow->isImplicitList() ||
-                        pGT->getDims() > 2)
+                //manage overload on list/struct/implicitlist and hypermatrix before management of []
+                if (pGT->isList() || poRow->isList() || pGT->isStruct() || poRow->isStruct() || poRow->isImplicitList() || pGT->getDims() > 2)
                 {
                     try
                     {
@@ -166,6 +165,12 @@ void RunVisitorT<T>::visitprivate(const MatrixExp &e)
                     continue;
                 }
 
+                if (pGT->isDouble() && pGT->getAs<types::Double>()->isEmpty())
+                {
+                    pGT->killMe();
+                    continue;
+                }
+
                 types::GenericType* pGTResult = poRow->getAs<types::GenericType>();
 
                 //check dimension
@@ -294,8 +299,7 @@ void RunVisitorT<T>::visitprivate(const MatrixExp &e)
             //check dimension
             types::GenericType* pGTResult = poResult->getAs<types::GenericType>();
 
-            if (pGT->isList() || pGTResult->isList() ||
-                    pGT->isStruct() || pGTResult->isStruct())
+            if (pGT->isList() || pGTResult->isList() || pGT->isStruct() || pGTResult->isStruct() || pGT->getDims() > 2)
             {
                 try
                 {
@@ -309,19 +313,6 @@ void RunVisitorT<T>::visitprivate(const MatrixExp &e)
                 continue;
             }
 
-            // hypermatrix case, will call %hm_f_hm
-            if (pGT->getDims() > 2)
-            {
-                try
-                {
-                    poResult = callOverloadMatrixExp(L"f", pGTResult, pGT);
-                }
-                catch (const InternalError& error)
-                {
-                    throw error;
-                }
-                continue;
-            }
 
             //check dimension
             if (pGT->getCols() != pGTResult->getCols())
@@ -363,7 +354,7 @@ void RunVisitorT<T>::visitprivate(const MatrixExp &e)
             {
                 try
                 {
-                    poResult = callOverloadMatrixExp(L"f", pGTResult, pGT);
+                   poResult = callOverloadMatrixExp(L"f", pGTResult, pGT);
                 }
                 catch (const InternalError& error)
                 {
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14055.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_14055.dia.ref
new file mode 100644 (file)
index 0000000..60a75ba
--- /dev/null
@@ -0,0 +1,32 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14055 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14055
+//
+// <-- Short Description -->
+// overload on matrix concatenation failed with []
+function L = %l_c_s(L,N)
+    L = lstcat(L, N)
+    assert_checkequal(N, check);
+endfunction
+//same function for line and column concatenation
+%l_f_s = %l_c_s;
+L = list("abc");
+check = %pi;
+l = [L check];
+assert_checkequal(l($), check);
+l = [L;check];
+assert_checkequal(l($), check);
+check = [];
+l = [L check];
+assert_checkequal(l($), check);
+l = [L;check];
+assert_checkequal(l($), check);
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14055.tst b/scilab/modules/ast/tests/nonreg_tests/bug_14055.tst
new file mode 100644 (file)
index 0000000..cab6b0d
--- /dev/null
@@ -0,0 +1,37 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14055 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14055
+//
+// <-- Short Description -->
+// overload on matrix concatenation failed with []
+
+function L = %l_c_s(L,N)
+    L = lstcat(L, N)
+    assert_checkequal(N, check);
+endfunction
+
+//same function for line and column concatenation
+%l_f_s = %l_c_s;
+
+L = list("abc");
+
+check = %pi;
+l = [L check];
+assert_checkequal(l($), check);
+l = [L;check];
+assert_checkequal(l($), check);
+
+check = [];
+l = [L check];
+assert_checkequal(l($), check);
+l = [L;check];
+assert_checkequal(l($), check);