dotdiv fixed 68/21768/3
Cedric Delamarre [Wed, 26 May 2021 09:32:24 +0000 (11:32 +0200)]
  * restore overload for dotdiv between eye() and int
  * template fixed for linux

  See also http://bugzilla.scilab.org/show_bug.cgi?id=16667

Change-Id: Ie4f12cde19a9d6711e7233ef4cc3c1f2a17a04f7

modules/ast/tests/nonreg_tests/bug_16667.tst [new file with mode: 0644]
scilab/modules/ast/includes/operations/types_dotdivide.hxx
scilab/modules/integer/macros/%i_d_s.sci [new file with mode: 0644]
scilab/modules/integer/macros/%s_d_i.sci [new file with mode: 0644]

diff --git a/modules/ast/tests/nonreg_tests/bug_16667.tst b/modules/ast/tests/nonreg_tests/bug_16667.tst
new file mode 100644 (file)
index 0000000..486c684
--- /dev/null
@@ -0,0 +1,20 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2021 - 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 16667 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/16667
+//
+// <-- Short Description -->
+// ./ is broken for a RHS having 0 (recent regression. 6.1.0 was OK)
+
+assert_checkequal(1./[1 0],[1 %inf])
+assert_checkequal(1./[1 -0],[1 -%inf])
index ee33d41..837c842 100644 (file)
@@ -165,8 +165,8 @@ template<> inline void dotdiv<double, double, double>(double l, size_t size, dou
 //x1c ./ x1
 template<typename T, typename U, typename O> inline static void dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
 {
-    dotdiv<T, U, O>(l, r, o);
-    dotdiv<T, U, O>(lc, r, oc);
+    dotdiv(l, r, o);
+    dotdiv(lc, r, oc);
     //*o = (O)l / (O)r;
     //*oc = (O)lc / (O)r;
 }
@@ -227,7 +227,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T* l, siz
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, U r, O* o)
-        dotdiv<T, U, O>(l[i], r[i], &o[i]);
+        dotdiv(l[i], r[i], &o[i]);
         //o[i] = (O)l[i] / (O)r[i];
     }
 }
@@ -238,7 +238,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T* l, T*
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
-        dotdiv<T, U, O>(l[i], lc[i], (size_t)1, r[i], &o[i], &oc[i]);
+        dotdiv(l[i], lc[i], (size_t)1, r[i], &o[i], &oc[i]);
         //o[i] = (O)l[i] / (O)r[i];
         //oc[i] = (O)lc[i] / (O)r[i];
     }
@@ -250,7 +250,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T* l, siz
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, size_t size, U r, U rc, O* o, O* oc)
-        dotdiv<T, U, O>(l[i], 1, r[i], rc[i], &o[i], &oc[i]);
+        dotdiv(l[i], 1, r[i], rc[i], &o[i], &oc[i]);
         //o[i] = ((O)l[i] * (O)r[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
         //oc[i] = ((O)l[i] * -(O)rc[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
     }
@@ -262,7 +262,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T* l, T*
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, T lc, size_t size, U r, U rc, O* o, O* oc)
-        dotdiv<T, U, O>(l[i], lc[i], 1, r[i], rc[i], &o[i], &oc[i]);
+        dotdiv(l[i], lc[i], 1, r[i], rc[i], &o[i], &oc[i]);
         //o[i] =  ((O)l[i] * (O)r[i] + (O)lc[i] * (O)rc[i] ) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
         //oc[i] = ((O)r[i] * (O)lc[i] - (O)rc[i] * (O)l[i] ) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
     }
@@ -274,7 +274,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T* l, siz
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, U r, O* o)
-        dotdiv<T, U, O>(l[i], r, &o[i]);
+        dotdiv(l[i], r, &o[i]);
         //o[i] = (O)l[i] / (O)r;
     }
 }
@@ -285,7 +285,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T l, size
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, U r, O* o)
-        dotdiv<T, U, O>(l, r[i], &o[i]);
+        dotdiv(l, r[i], &o[i]);
         //o[i] = (O)l / (O)r[i];
     }
 }
@@ -298,7 +298,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T* l, siz
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, size_t size, U r, U rc, O* o, O* oc)
-        dotdiv<T, U, O >(l[i], (size_t)1, r, rc, &o[i], &oc[i]);
+        dotdiv(l[i], (size_t)1, r, rc, &o[i], &oc[i]);
         //o[i] = ((O)l[i] * (O)r) / denum;
         //oc[i] = ((O)l[i] * -(O)rc) / denum;
     }
@@ -310,7 +310,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T l, size
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, size_t size, U r, U rc, O* o, O* oc)
-        dotdiv<T, U, O>(l, (size_t)1, r[i], rc[i], &o[i], &oc[i]);
+        dotdiv(l, (size_t)1, r[i], rc[i], &o[i], &oc[i]);
         //o[i] = ((O)l * (O)r[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
         //oc[i] = ((O)l * -(O)rc[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
     }
@@ -322,7 +322,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T* l, T*
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
-        dotdiv<T, U, O>(l[i], lc[i], (size_t)1, r, &o[i], &oc[i]);
+        dotdiv(l[i], lc[i], (size_t)1, r, &o[i], &oc[i]);
         //o[i] = (O)l[i] / (O)r;
         //oc[i] = (O)lc[i] / (O)r;
     }
@@ -334,7 +334,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T l, T lc
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
-        dotdiv<T, U, O>(l, lc, (size_t)1, r[i], &o[i], &oc[i]);
+        dotdiv(l, lc, (size_t)1, r[i], &o[i], &oc[i]);
         //o[i] = (O)l / (O)r[i];
         //oc[i] = (O)lc / (O)r[i];
     }
@@ -348,7 +348,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T* l, T*
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
-        dotdiv<T, U, O>(l[i], lc[i], (size_t)1, r, rc, &o[i], &oc[i]);
+        dotdiv(l[i], lc[i], (size_t)1, r, rc, &o[i], &oc[i]);
         //o[i] = ((O)l[i] * (O)r + (O)lc[i] * (O)rc) / denum;
         //oc[i] = ((O)r * (O)lc[i] - (O)rc * (O)l[i] ) / denum ;
     }
@@ -360,7 +360,7 @@ template<typename T, typename U, typename O> inline static void dotdiv(T l, T lc
     for (size_t i = 0; i < size ; ++i)
     {
         //dotdiv(T l, T lc, size_t size, U r, O* o, O* oc)
-        dotdiv<T, U, O>(l, lc, (size_t)1, r[i], rc[i], &o[i], &oc[i]);
+        dotdiv(l, lc, (size_t)1, r[i], rc[i], &o[i], &oc[i]);
         //o[i] = ((O)l * (O)r[i] + (O)lc * (O)rc[i]) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]);
         //oc[i] = ((O)r[i] * (O)lc - (O)rc[i] * (O)l ) / ((O)rc[i] * (O)rc[i] + (O)r[i] * (O)r[i]) ;
     }
diff --git a/scilab/modules/integer/macros/%i_d_s.sci b/scilab/modules/integer/macros/%i_d_s.sci
new file mode 100644 (file)
index 0000000..f2c1901
--- /dev/null
@@ -0,0 +1,21 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) INRIA -
+// Copyright (C) 2013 - Samuel GOUGEON : http://bugzilla.scilab.org/13000
+
+// Copyright (C) 2012 - 2016 - Scilab Enterprises
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+// used to manage int ./ eye()
+function r = %i_d_s(a,b)
+    if b==[] then
+        r = []
+    else
+        r = a./iconvert(b,inttype(a))
+    end
+endfunction
\ No newline at end of file
diff --git a/scilab/modules/integer/macros/%s_d_i.sci b/scilab/modules/integer/macros/%s_d_i.sci
new file mode 100644 (file)
index 0000000..12ad73b
--- /dev/null
@@ -0,0 +1,21 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) INRIA -
+// Copyright (C) 2013 - Samuel GOUGEON : http://bugzilla.scilab.org/13000
+//
+// Copyright (C) 2012 - 2016 - Scilab Enterprises
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+// used to manage eye() ./ int
+function r = %s_d_i(a,b)
+    if a==[] then
+        r = []
+    else
+        r = iconvert(a,inttype(b))./b
+    end
+endfunction
\ No newline at end of file