Bug 15885 fixed: break in an else block is broken 44/20644/1
Antoine ELIAS [Wed, 28 Nov 2018 11:30:42 +0000 (12:30 +0100)]
Change-Id: I216373a690e6db435d06b8f1bb05d0a59740a76a

scilab/modules/ast/src/cpp/ast/runvisitor.cpp
scilab/modules/ast/tests/nonreg_tests/bug_15885.tst [new file with mode: 0644]

index 2641228..cb67331 100644 (file)
@@ -522,8 +522,8 @@ void RunVisitorT<T>::visitprivate(const IfExp  &e)
         throw;
     }
 
-    bool elseIsContinue = e.hasElse() && (&e.getElse())->isContinue();
-    if (e.isBreakable() && (elseIsContinue || (&e.getThen())->isBreak()))
+    bool elseIsBreak = e.hasElse() && (&e.getElse())->isBreak();
+    if (e.isBreakable() && (elseIsBreak || (&e.getThen())->isBreak()))
     {
         const_cast<IfExp*>(&e)->setBreak();
         const_cast<Exp*>(&e.getThen())->resetBreak();
@@ -533,6 +533,7 @@ void RunVisitorT<T>::visitprivate(const IfExp  &e)
         }
     }
 
+    bool elseIsContinue = e.hasElse() && (&e.getElse())->isContinue();
     if (e.isContinuable() && (elseIsContinue || (&e.getThen())->isContinue()))
     {
         const_cast<IfExp*>(&e)->setContinue();
@@ -544,8 +545,7 @@ void RunVisitorT<T>::visitprivate(const IfExp  &e)
     }
 
     bool elseIsReturn = e.hasElse() && (&e.getElse())->isReturn();
-    if (e.isReturnable()
-            && (elseIsReturn || (&e.getThen())->isReturn()))
+    if (e.isReturnable() && (elseIsReturn || (&e.getThen())->isReturn()))
     {
         const_cast<IfExp*>(&e)->setReturn();
         const_cast<Exp*>(&e.getThen())->resetReturn();
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_15885.tst b/scilab/modules/ast/tests/nonreg_tests/bug_15885.tst
new file mode 100644 (file)
index 0000000..8cad6b9
--- /dev/null
@@ -0,0 +1,39 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - ESI - 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 15885 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15885
+//
+// <-- Short Description -->
+// break in an else block is broken
+
+j = 0;
+for i = 1:4
+    if %f
+    else
+        break
+    end
+    j = j + 1;
+end
+
+assert_checktrue(j == 0);
+
+j = 0;
+for i = 1:4
+    if %t
+        break
+    else
+    end
+    j = j + 1;
+end
+
+assert_checktrue(j == 0);