* Bug 16483 fixed: substraction of complex polynomial matrix was broken 16/21516/3
mottelet [Tue, 30 Jun 2020 16:40:30 +0000 (18:40 +0200)]
http://bugzilla.scilab.org/show_bug.cgi?id=16483

Change-Id: I2b53b89dd73609c625c642289de1bfd595c81052

scilab/CHANGES.md
scilab/modules/ast/src/cpp/operations/types_subtraction.cpp
scilab/modules/ast/tests/nonreg_tests/bug_16483.tst [new file with mode: 0644]

index 9eac4ad..a8d211d 100644 (file)
@@ -551,3 +551,4 @@ Bug Fixes
 * [#16373](https://bugzilla.scilab.org/16373): Scilab Crashed or showing wrong output when running on Arm processor
 * [#16459](https://bugzilla.scilab.org/16459): The display of one column hypermatrix was wrong.
 * [#16463](https://bugzilla.scilab.org/16463): `matrix(sparse([]),[0 0])` yielded `[]` instead of `sparse([])`.
+* [#16483](https://bugzilla.scilab.org/16483): substraction of complex polynomial matrices was broken (Scilab 6 regression).
\ No newline at end of file
index c7aad4c..f186031 100644 (file)
@@ -1794,6 +1794,8 @@ template<> InternalType* sub_M_M<Polynom, Polynom, Polynom>(Polynom* _pL, Polyno
 
         double *p1R     = _pL->get(i)->get();
         double *p2R     = _pR->get(i)->get();
+        double *p1I     = _pL->get(i)->getImg();
+        double *p2I     = _pR->get(i)->getImg();
         double *pOutR   = pOutCoef->get();
         int iMin        = std::min(pRank1[i], pRank2[i]);
         int iMax        = std::max(pRank1[i], pRank2[i]);
@@ -1804,15 +1806,18 @@ template<> InternalType* sub_M_M<Polynom, Polynom, Polynom>(Polynom* _pL, Polyno
         }
 
         double *pTemp   = NULL;
+        double *pTempI  = NULL;
         int iCoef       = 1;
         if (pRank1[i] > pRank2[i])
         {
             pTemp       = p1R;
+            pTempI      = p1I;
             iCoef       = 1;
         }
         else
         {
             pTemp       = p2R;
+            pTempI      = p2I;
             iCoef       = -1;
         }
 
@@ -1823,8 +1828,6 @@ template<> InternalType* sub_M_M<Polynom, Polynom, Polynom>(Polynom* _pL, Polyno
 
         if (isOutComplex)
         {
-            double *p1I     = _pL->get(i)->getImg();
-            double *p2I     = _pR->get(i)->getImg();
             double *pOutI   = pOutCoef->getImg();
 
             for (int j = 0 ; j < iMin + 1 ; j++)
@@ -1832,9 +1835,12 @@ template<> InternalType* sub_M_M<Polynom, Polynom, Polynom>(Polynom* _pL, Polyno
                 pOutI[j]    = (p1I == NULL ? 0 : p1I[j]) - (p2I == NULL ? 0 : p2I[j]);
             }
 
-            for (int j = iMin + 1 ; j < iMax + 1 ; j++)
+            if (pTempI != NULL)
             {
-                pOutI[j]  = pTemp[j] * iCoef;
+                for (int j = iMin + 1 ; j < iMax + 1 ; j++)
+                {
+                    pOutI[j]  = pTempI[j] * iCoef;
+                }                
             }
         }
     }
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_16483.tst b/scilab/modules/ast/tests/nonreg_tests/bug_16483.tst
new file mode 100644 (file)
index 0000000..33b0a99
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - St├ęphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 16483 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16483
+//
+// <-- Short Description -->
+// substraction of complex polynomial matrices is broken (Scilab 6 regression)
+
+A=[%i+%s 0;0 %s];
+B=[%i+%s 0;0 0];
+
+assert_checkequal(A-B,[0 0;0 %s])
+assert_checkequal(B-A,[0 0;0 -%s])