bug #14047: wrong behaviour of break ( continue ) in if outside of loop. 42/17242/2
Antoine ELIAS [Wed, 23 Sep 2015 15:09:08 +0000 (17:09 +0200)]
Change-Id: I6eb64726d4a7ae59c98d8af2f20b957090d46ef9

scilab/CHANGES_6.0.X
scilab/modules/ast/includes/exps/ifexp.hxx
scilab/modules/ast/tests/nonreg_tests/bug_14047.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/nonreg_tests/bug_14047.tst [new file with mode: 0644]

index caffdb7..6a5b0e0 100644 (file)
@@ -61,6 +61,8 @@ Scilab Bug Fixes
 
 * Bug #14040 fixed - graphic property setting fails when using array of handles
 
+* Bug #14047 fixed - wrong behaviour of break ( continue ) in if outside of loop.
+
 * Bug #14049 fixed - genlib hangs if an unexpected endfunction occurs.
 
 * Bug #14057 fixed - grand(m,n) returned a wrong error and grand(m,n,p) called an overloading function instead of returning an error.
index 32833ed..c0f6f44 100644 (file)
@@ -44,11 +44,6 @@ public:
         _exps.push_back(&test);
         _exps.push_back(t.getAs<Exp>());
         _exps.push_back(e.getAs<Exp>());
-
-        t.setContinuable();
-        t.setBreakable();
-        e.setContinuable();
-        e.setBreakable();
     }
 
     IfExp(const Location& location,
@@ -63,9 +58,6 @@ public:
         _exps.push_back(t.getAs<Exp>());
         _exps.push_back(new ast::CommentExp(location, new std::wstring(L"No else !!")));
         _exps[2]->setParent(this);
-
-        t.setContinuable();
-        t.setBreakable();
     }
 
     virtual ~IfExp()
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14047.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_14047.dia.ref
new file mode 100644 (file)
index 0000000..73dd735
--- /dev/null
@@ -0,0 +1,53 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14047 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14047
+//
+// <-- Short Description -->
+// wrong behaviour of break ( continue ) in if outside of loop
+function y = testBreak()
+    if 1 then
+        y = 2;
+        break;
+        y = 3;
+    end
+endfunction
+assert_checkequal(testBreak(), 3);
+function y = testContinue()
+    if 1 then
+        y = 2;
+        continue;
+        y = 3;
+    end
+endfunction
+assert_checkequal(testContinue(), 3);
+clear testBreak testContinue
+//check normal behaviour
+function y = testBreak()
+    y = 0;
+    for i = 1:5
+        if i == 3 then
+            break;
+        end
+        y = y + 1;
+    end
+endfunction
+assert_checkequal(testBreak(), 2);
+function y = testContinue()
+    y = 0;
+    for i = 1:5
+        if i == 3 then
+            continue;
+        end
+        y = y + 1;
+    end
+endfunction
+assert_checkequal(testContinue(), 4);
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_14047.tst b/scilab/modules/ast/tests/nonreg_tests/bug_14047.tst
new file mode 100644 (file)
index 0000000..1be74c1
--- /dev/null
@@ -0,0 +1,64 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 14047 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/14047
+//
+// <-- Short Description -->
+// wrong behaviour of break ( continue ) in if outside of loop
+
+function y = testBreak()
+    if 1 then
+        y = 2;
+        break;
+        y = 3;
+    end
+endfunction
+
+assert_checkequal(testBreak(), 3);
+
+
+function y = testContinue()
+    if 1 then
+        y = 2;
+        continue;
+        y = 3;
+    end
+endfunction
+
+assert_checkequal(testContinue(), 3);
+
+clear testBreak testContinue
+//check normal behaviour
+function y = testBreak()
+    y = 0;
+    for i = 1:5
+        if i == 3 then
+            break;
+        end
+
+        y = y + 1;
+    end
+endfunction
+
+assert_checkequal(testBreak(), 2);
+
+function y = testContinue()
+    y = 0;
+    for i = 1:5
+        if i == 3 then
+            continue;
+        end
+
+        y = y + 1;
+    end
+endfunction
+
+assert_checkequal(testContinue(), 4);