[bug_15008] overloading call fix with operators AND OR 17/19217/2
Cedric Delamarre [Wed, 22 Mar 2017 09:42:32 +0000 (10:42 +0100)]
    * test_run ast bug_15008

Change-Id: I3b6cbac32650a4039cbad490faaf0ff50e20d52b

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

index e09babd..8aec9a6 100644 (file)
@@ -354,6 +354,7 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 * [#14886](http://bugzilla.scilab.org/show_bug.cgi?id=14886): Matplot save/load failed.
 * [#14910](http://bugzilla.scilab.org/show_bug.cgi?id=14910): The `plot()` example was displayed in overlay to the existing graphics.
 * [#14978](http://bugzilla.scilab.org/show_bug.cgi?id=15006): ode help page still contained 'root' which has been replaced by 'roots'.
+* [#15008](http://bugzilla.scilab.org/show_bug.cgi?id=15008): scilab crash in using operator AND (&, &&) or OR (| ||) with a string.
 * [#15010](http://bugzilla.scilab.org/show_bug.cgi?id=15010): Coselica did not simulate on Scilab 6.
 * [#15015](http://bugzilla.scilab.org/show_bug.cgi?id=15015): Xcos blocks using the `ascii` didn't work
 * [#15019](http://bugzilla.scilab.org/show_bug.cgi?id=15019): Add 'csci6' in the calling of ilib_build in 'Getting started with API_Scilab' help page.
index 3fe7447..0a711ba 100644 (file)
@@ -290,8 +290,8 @@ void RunVisitorT<T>::visitprivate(const LogicalOpExp &e)
                     }
                 }
                 pResult = GenericLogicalAnd(pITL, pITR);
-                
-                if (e.getOper() == LogicalOpExp::logicalShortCutAnd)
+
+                if (pResult && e.getOper() == LogicalOpExp::logicalShortCutAnd)
                 {
                     types::InternalType* pResult2 = GenericShortcutAnd(pResult);
                     pResult->killMe();
@@ -338,7 +338,7 @@ void RunVisitorT<T>::visitprivate(const LogicalOpExp &e)
                     }
                 }
                 pResult = GenericLogicalOr(pITL, pITR);
-                if (e.getOper() == LogicalOpExp::logicalShortCutOr)
+                if (pResult && e.getOper() == LogicalOpExp::logicalShortCutOr)
                 {
                     types::InternalType* pResult2 = GenericShortcutOr(pResult);
                     pResult->killMe();
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_15008.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_15008.dia.ref
new file mode 100644 (file)
index 0000000..af663dc
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 15008 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=15008
+//
+// <-- Short Description -->
+// scilab crash in using operator AND (&, &&) or OR (| ||) with a string.
+b_and_c = msprintf(_("Undefined operation for the given operands.\n") + "%s", msprintf(_("check or define function %s for overloading.\n"), "%b_h_c"));
+c_and_b = msprintf(_("Undefined operation for the given operands.\n") + "%s", msprintf(_("check or define function %s for overloading.\n"), "%c_h_b"));
+b_or_c  = msprintf(_("Undefined operation for the given operands.\n") + "%s", msprintf(_("check or define function %s for overloading.\n"), "%b_g_c"));
+c_or_b  = msprintf(_("Undefined operation for the given operands.\n") + "%s", msprintf(_("check or define function %s for overloading.\n"), "%c_g_b"));
+assert_checkerror("if %t & ""0"" then, end;", b_and_c);
+assert_checkerror("if %t && ""0"" then, end;", b_and_c);
+assert_checkerror("if ""0"" & %t then, end;", c_and_b);
+assert_checkerror("if ""0"" && %t then, end;", c_and_b);
+assert_checkerror("if %f | ""0"" then, end;", b_or_c);
+assert_checkerror("if %f || ""0"" then, end;", b_or_c);
+assert_checkerror("if ""0"" | %t then, end;", c_or_b);
+assert_checkerror("if ""0"" || %t then, end;", c_or_b);
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_15008.tst b/scilab/modules/ast/tests/nonreg_tests/bug_15008.tst
new file mode 100644 (file)
index 0000000..935a98a
--- /dev/null
@@ -0,0 +1,31 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Scilab Enterprises - Cedric Delamarre
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 15008 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=15008
+//
+// <-- Short Description -->
+// scilab crash in using operator AND (&, &&) or OR (| ||) with a string.
+
+b_and_c = msprintf(_("Undefined operation for the given operands.\n") + "%s", msprintf(_("check or define function %s for overloading.\n"), "%b_h_c"));
+c_and_b = msprintf(_("Undefined operation for the given operands.\n") + "%s", msprintf(_("check or define function %s for overloading.\n"), "%c_h_b"));
+b_or_c  = msprintf(_("Undefined operation for the given operands.\n") + "%s", msprintf(_("check or define function %s for overloading.\n"), "%b_g_c"));
+c_or_b  = msprintf(_("Undefined operation for the given operands.\n") + "%s", msprintf(_("check or define function %s for overloading.\n"), "%c_g_b"));
+
+assert_checkerror("if %t & ""0"" then, end;", b_and_c);
+assert_checkerror("if %t && ""0"" then, end;", b_and_c);
+assert_checkerror("if ""0"" & %t then, end;", c_and_b);
+assert_checkerror("if ""0"" && %t then, end;", c_and_b);
+
+assert_checkerror("if %f | ""0"" then, end;", b_or_c);
+assert_checkerror("if %f || ""0"" then, end;", b_or_c);
+assert_checkerror("if ""0"" | %t then, end;", c_or_b);
+assert_checkerror("if ""0"" || %t then, end;", c_or_b);