bug 14671: || misworks when LHS is %f or zeros. ... 46/19046/4
Antoine ELIAS [Tue, 7 Feb 2017 08:48:00 +0000 (09:48 +0100)]
Change-Id: Idb37eb4649fa8f9a962b214c3421ac0ea2c32c65

scilab/CHANGES.md
scilab/modules/ast/src/cpp/ast/run_OpExp.hpp
scilab/modules/ast/tests/nonreg_tests/bug_14761.tst [new file with mode: 0644]

index 2d92f91..d519759 100644 (file)
@@ -444,6 +444,7 @@ Bug Fixes
 * [#14714](http://bugzilla.scilab.org/show_bug.cgi?id=14714): Crash/Leak when deleting datatip
 * [#14743](http://bugzilla.scilab.org/show_bug.cgi?id=14743): `test_run(.., "show_error")` did not document "failed: Slave Scilab exited with error code #" errors.
 * [#14758](http://bugzilla.scilab.org/show_bug.cgi?id=14758): xstringb creates a figure when no exists.
+* [#14761](http://bugzilla.scilab.org/show_bug.cgi?id=14761): `||` misworked when LHS is %f or zeros. `&&` misworked when LHS is %t or non-zeros
 * [#14779](http://bugzilla.scilab.org/show_bug.cgi?id=14779): When used logarithmic mode using coordinates <=0, xsegs crashed Scilab.
 * [#14784](http://bugzilla.scilab.org/show_bug.cgi?id=14784): Setting field of graphics handle using children($) failed.
 * [#14796](http://bugzilla.scilab.org/show_bug.cgi?id=14796): `ind2sub(dims, [])` returned [] in version 6. Warnings due to a `[]+1` operation occurred
index 76e0c7e..3fe7447 100644 (file)
@@ -290,6 +290,20 @@ void RunVisitorT<T>::visitprivate(const LogicalOpExp &e)
                     }
                 }
                 pResult = GenericLogicalAnd(pITL, pITR);
+                
+                if (e.getOper() == LogicalOpExp::logicalShortCutAnd)
+                {
+                    types::InternalType* pResult2 = GenericShortcutAnd(pResult);
+                    pResult->killMe();
+                    if (pResult2)
+                    {
+                        pResult = pResult2;
+                    }
+                    else
+                    {
+                        pResult = new types::Bool(1);
+                    }
+                }
                 break;
             }
             case LogicalOpExp::logicalShortCutOr:
@@ -324,6 +338,19 @@ void RunVisitorT<T>::visitprivate(const LogicalOpExp &e)
                     }
                 }
                 pResult = GenericLogicalOr(pITL, pITR);
+                if (e.getOper() == LogicalOpExp::logicalShortCutOr)
+                {
+                    types::InternalType* pResult2 = GenericShortcutOr(pResult);
+                    pResult->killMe();
+                    if (pResult2)
+                    {
+                        pResult = pResult2;
+                    }
+                    else
+                    {
+                        pResult = new types::Bool(0);
+                    }
+                }
                 break;
             }
 
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14761.tst b/scilab/modules/ast/tests/nonreg_tests/bug_14761.tst
new file mode 100644 (file)
index 0000000..68f96f7
--- /dev/null
@@ -0,0 +1,64 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Scilab Enterprises - 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 14761 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=14761
+//
+// <-- Short Description -->
+//
+// || misworks when LHS is %f or zeros. && misworks when LHS is %t or non-zeros
+
+m = [4 9 8;1 5 3];
+z = zeros(2,3);
+
+assert_checkequal(m || %f, and(m));
+assert_checkequal(m || %t, %t);
+assert_checkequal(%f || m, and(m));
+assert_checkequal(%t || m, %t);
+
+assert_checkequal(z || %f, and(z));
+assert_checkequal(z || %t, %t);
+assert_checkequal(%f || z, and(z));
+assert_checkequal(%t || z, %t);
+
+assert_checkequal(m && %f, %f);
+assert_checkequal(m && %t, and(m));
+assert_checkequal(%f && m, %f);
+assert_checkequal(%t && m, and(m));
+
+assert_checkequal(z && %f, %f);
+assert_checkequal(z && %t, and(z));
+assert_checkequal(%f && z, %f);
+assert_checkequal(%t && z, and(z));
+
+//introduce a 0
+m(2,2)=0;
+
+assert_checkequal(m || %f, and(m));
+assert_checkequal(m || %t, %t);
+assert_checkequal(%f || m, and(m));
+assert_checkequal(%t || m, %t);
+
+assert_checkequal(z || %f, and(z));
+assert_checkequal(z || %t, %t);
+assert_checkequal(%f || z, and(z));
+assert_checkequal(%t || z, %t);
+
+assert_checkequal(m && %f, %f);
+assert_checkequal(m && %t, and(m));
+assert_checkequal(%f && m, %f);
+assert_checkequal(%t && m, and(m));
+
+assert_checkequal(z && %f, %f);
+assert_checkequal(z && %t, and(z));
+assert_checkequal(%f && z, %f);
+assert_checkequal(%t && z, and(z));