$title 'Advanced test for break and continue statements' (BREAKCONT2,SEQ=731) $onText Keyword: break, continue Contributor: Lutz Westermann, May 2017 $offText set i /i1*i10/ j /j1*j10/ k /k1*k10/ l /l1*l10/ ij(i,j) /#i:#j /; scalar cnt1, cnt2, cnt3, cnt4, cnt5, cnt6, cnt7, cntFor, cntWhile; parameter dummy(i) p(i,j) /#i:#j 2/; $macro inc(x) x=x+1 cnt1=0; loop(j, dummy('i5')=1; inc(cnt1); ); abort$(cnt1<>10) 'Error 1'; cnt1=0; cnt2=0; loop(j, dummy('i5')=1; inc(cnt1); break; inc(cnt2); ); abort$(cnt1<>1) 'Error 2a'; abort$(cnt2<>0) 'Error 2b'; cnt1=0; cnt2=0; loop(j, dummy('i5')=1; inc(cnt1); continue; inc(cnt2); ); abort$(cnt1<>10) 'Error 3a'; abort$(cnt2<>0 ) 'Error 3b'; cnt1=0; loop(i('i5'), inc(cnt1); ); abort$(cnt1<>1) 'Error 4'; cnt1=0; cnt2=0; loop(i('i5'), inc(cnt1); break; inc(cnt2); ); abort$(cnt1<>1) 'Error 5a'; abort$(cnt2<>0) 'Error 5b'; cnt1=0; cnt2=0; loop(i('i5'), inc(cnt1); continue; inc(cnt2); ); abort$(cnt1<>1) 'Error 6a'; abort$(cnt2<>0) 'Error 6b'; cnt1=0; loop(ij, inc(cnt1); ); abort$(cnt1<>10) 'Error 7'; cnt1=0; cnt2=0; loop(ij, inc(cnt1); break; inc(cnt2); ); abort$(cnt1<>1) 'Error 8a'; abort$(cnt2<>0) 'Error 8b'; cnt1=0; cnt2=0; loop(ij, inc(cnt1); continue; inc(cnt2); ); abort$(cnt1<>10) 'Error 9a'; abort$(cnt2<>0 ) 'Error 9b'; cnt1=0; loop(ij(i,j), inc(cnt1); ); abort$(cnt1<>10) 'Error 10'; cnt1=0; cnt2=0; loop(ij(i,j), inc(cnt1); break; inc(cnt2); ); abort$(cnt1<>1) 'Error 11a'; abort$(cnt2<>0) 'Error 11b'; cnt1=0; cnt2=0; loop(ij(i,j), inc(cnt1); continue; inc(cnt2); ); abort$(cnt1<>10) 'Error 12a'; abort$(cnt2<>0 ) 'Error 12b'; cnt1=0; loop((i,j), inc(cnt1); ); abort$(cnt1<>100) 'Error 13'; cnt1=0; cnt2=0; loop((i,j), inc(cnt1); break; inc(cnt2); ); abort$(cnt1<>1) 'Error 14a'; abort$(cnt2<>0) 'Error 14b'; cnt1=0; cnt2=0; loop((i,j), inc(cnt1); continue; inc(cnt2); ); abort$(cnt1<>100) 'Error 15a'; abort$(cnt2<>0 ) 'Error 15b'; cnt1=0; loop((i,j)$p(i,j), inc(cnt1); ); abort$(cnt1<>10) 'Error 16'; cnt1=0; cnt2=0; loop((i,j)$p(i,j), inc(cnt1); break; inc(cnt2); ); abort$(cnt1<>1) 'Error 17a'; abort$(cnt2<>0) 'Error 17b'; cnt1=0; cnt2=0; loop((i,j)$p(i,j), inc(cnt1); continue; inc(cnt2); ); abort$(cnt1<>10) 'Error 18a'; abort$(cnt2<>0 ) 'Error 18b'; ij(i,j)=yes; p (i,j)=3; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; loop(i, inc(cnt1); cntWhile=0; while(cntWhile<10, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 10, inc(cnt6); ); ); ); ); ); ); abort$(cnt1<>10 ) 'Error 19a'; abort$(cnt2<>100 ) 'Error 19b'; abort$(cnt3<>100 ) 'Error 19c'; abort$(cnt4<>1000 ) 'Error 19d'; abort$(cnt5<>1000 ) 'Error 19e'; abort$(cnt6<>10000) 'Error 19f'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i, inc(cnt1); cntWhile=0; while(cntWhile<10, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 10, inc(cnt6); continue; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>10 ) 'Error 20a'; abort$(cnt2<>100 ) 'Error 20b'; abort$(cnt3<>100 ) 'Error 20c'; abort$(cnt4<>1000 ) 'Error 20d'; abort$(cnt5<>1000 ) 'Error 20e'; abort$(cnt6<>10000) 'Error 20f'; abort$(cnt7<>0 ) 'Error 20g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i, inc(cnt1); cntWhile=0; while(cntWhile<10, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 10, inc(cnt6); break; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>10 ) 'Error 21a'; abort$(cnt2<>100 ) 'Error 21b'; abort$(cnt3<>100 ) 'Error 21c'; abort$(cnt4<>1000) 'Error 21d'; abort$(cnt5<>1000) 'Error 21e'; abort$(cnt6<>1000) 'Error 21f'; abort$(cnt7<>0 ) 'Error 21g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i, inc(cnt1); cntWhile=0; while(cntWhile<10, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 10, inc(cnt6); break 2; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>10 ) 'Error 22a'; abort$(cnt2<>100 ) 'Error 22b'; abort$(cnt3<>100 ) 'Error 22c'; abort$(cnt4<>1000) 'Error 22d'; abort$(cnt5<>1000) 'Error 22e'; abort$(cnt6<>1000) 'Error 22f'; abort$(cnt7<>0 ) 'Error 22g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i, inc(cnt1); cntWhile=0; while(cntWhile<10, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 10, inc(cnt6); break 3; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>10 ) 'Error 23a'; abort$(cnt2<>100) 'Error 23b'; abort$(cnt3<>100) 'Error 23c'; abort$(cnt4<>100) 'Error 23d'; abort$(cnt5<>100) 'Error 23e'; abort$(cnt6<>100) 'Error 23f'; abort$(cnt7<>0 ) 'Error 23g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i, inc(cnt1); cntWhile=0; while(cntWhile<10, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 10, inc(cnt6); break 4; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>10 ) 'Error 24a'; abort$(cnt2<>100) 'Error 24b'; abort$(cnt3<>100) 'Error 24c'; abort$(cnt4<>100) 'Error 24d'; abort$(cnt5<>100) 'Error 24e'; abort$(cnt6<>100) 'Error 24f'; abort$(cnt7<>0 ) 'Error 24g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i, inc(cnt1); cntWhile=0; while(cntWhile<10, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 10, inc(cnt6); break 5; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>10) 'Error 25a'; abort$(cnt2<>10) 'Error 25b'; abort$(cnt3<>10) 'Error 25c'; abort$(cnt4<>10) 'Error 25d'; abort$(cnt5<>10) 'Error 25e'; abort$(cnt6<>10) 'Error 25f'; abort$(cnt7<>0 ) 'Error 25g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i, inc(cnt1); cntWhile=0; while(cntWhile<10, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 10, inc(cnt6); break 6; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>1) 'Error 26a'; abort$(cnt2<>1) 'Error 26b'; abort$(cnt3<>1) 'Error 26c'; abort$(cnt4<>1) 'Error 26d'; abort$(cnt5<>1) 'Error 26e'; abort$(cnt6<>1) 'Error 26f'; abort$(cnt7<>0) 'Error 26g'; ij(i,j)=ord(i)<=2 and ord(j)<=2; p (i,j)=4$ij(i,j); Equation e; Variable v; e.. v =e= 1; model m /e/; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; loop(i$(ord(i)<=2), inc(cnt1); cntWhile=0; while(cntWhile<2, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 2, inc(cnt6); solve m min v use lp; ); ); ); ); ); ); abort$(cnt1<>2 ) 'Error 27a'; abort$(cnt2<>4 ) 'Error 27b'; abort$(cnt3<>4 ) 'Error 27c'; abort$(cnt4<>8 ) 'Error 27d'; abort$(cnt5<>8 ) 'Error 27e'; abort$(cnt6<>16) 'Error 27f'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i$(ord(i)<=2), inc(cnt1); cntWhile=0; while(cntWhile<2, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 2, inc(cnt6); solve m min v use lp; continue; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>2 ) 'Error 28a'; abort$(cnt2<>4 ) 'Error 28b'; abort$(cnt3<>4 ) 'Error 28c'; abort$(cnt4<>8 ) 'Error 28d'; abort$(cnt5<>8 ) 'Error 28e'; abort$(cnt6<>16) 'Error 28f'; abort$(cnt7<>0 ) 'Error 28g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i$(ord(i)<=2), inc(cnt1); cntWhile=0; while(cntWhile<2, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 2, inc(cnt6); solve m min v use lp; break; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>2) 'Error 29a'; abort$(cnt2<>4) 'Error 29b'; abort$(cnt3<>4) 'Error 29c'; abort$(cnt4<>8) 'Error 29d'; abort$(cnt5<>8) 'Error 29e'; abort$(cnt6<>8) 'Error 29f'; abort$(cnt7<>0) 'Error 29g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i$(ord(i)<=2), inc(cnt1); cntWhile=0; while(cntWhile<2, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 2, inc(cnt6); solve m min v use lp; break 2; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>2) 'Error 30a'; abort$(cnt2<>4) 'Error 30b'; abort$(cnt3<>4) 'Error 30c'; abort$(cnt4<>8) 'Error 30d'; abort$(cnt5<>8) 'Error 30e'; abort$(cnt6<>8) 'Error 30f'; abort$(cnt7<>0) 'Error 30g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i$(ord(i)<=2), inc(cnt1); cntWhile=0; while(cntWhile<2, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 2, inc(cnt6); solve m min v use lp; break 3; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>2) 'Error 31a'; abort$(cnt2<>4) 'Error 31b'; abort$(cnt3<>4) 'Error 31c'; abort$(cnt4<>4) 'Error 31d'; abort$(cnt5<>4) 'Error 31e'; abort$(cnt6<>4) 'Error 31f'; abort$(cnt7<>0) 'Error 31g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i$(ord(i)<=2), inc(cnt1); cntWhile=0; while(cntWhile<2, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 2, inc(cnt6); solve m min v use lp; break 4; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>2) 'Error 32a'; abort$(cnt2<>4) 'Error 32b'; abort$(cnt3<>4) 'Error 32c'; abort$(cnt4<>4) 'Error 32d'; abort$(cnt5<>4) 'Error 32e'; abort$(cnt6<>4) 'Error 32f'; abort$(cnt7<>0) 'Error 32g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i$(ord(i)<=2), inc(cnt1); cntWhile=0; while(cntWhile<2, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 2, inc(cnt6); solve m min v use lp; break 5; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>2) 'Error 33a'; abort$(cnt2<>2) 'Error 33b'; abort$(cnt3<>2) 'Error 33c'; abort$(cnt4<>2) 'Error 33d'; abort$(cnt5<>2) 'Error 33e'; abort$(cnt6<>2) 'Error 33f'; abort$(cnt7<>0) 'Error 33g'; cnt1=0; cnt2=0; cnt3=0; cnt4=0; cnt5=0; cnt6=0; cnt7=0; loop(i$(ord(i)<=2), inc(cnt1); cntWhile=0; while(cntWhile<2, inc(cntWhile); inc(cnt2); loop(k('k5'), inc(cnt3); loop(ij(i,j)$p(i,j), inc(cnt4); loop(l('l6'), inc(cnt5); for(cntFor=1 to 2, inc(cnt6); solve m min v use lp; break 6; inc(cnt7); ); ); ); ); ); ); abort$(cnt1<>1) 'Error 34a'; abort$(cnt2<>1) 'Error 34b'; abort$(cnt3<>1) 'Error 34c'; abort$(cnt4<>1) 'Error 34d'; abort$(cnt5<>1) 'Error 34e'; abort$(cnt6<>1) 'Error 34f'; abort$(cnt7<>0) 'Error 34g'; * There was a bug in 24.8.5 (fixed with 24.9.1, see #3228). * It could be reproduced like this: set iBig / ib1*ib300 / jSub(j) / #j / iBigj(iBig,j) / #iBig.#j / jSubSub(j) / #j /; cnt1 = 0; loop ((iBig,jSub), * The problem was triggered by two cntrJmp instructions pointing to the same * cntrEnd instruction, so the stack was pushed twice but just popped once loop (iBigj(iBig,jSubSub(jSub)), cnt1 = cnt1+10; ); cnt1 = cnt1+1; ); abort$(cnt1<>33000) 'Error 35a'; set iS / i1*i2 / jS / j1*j2 / s(iS) ijS(iS,jS) / #iS.#jS / ; * There was a bug fixed after 34.2.0, see #4438 * It could be reproduced like this: cnt1=0; cnt2=0; cnt3=0; loop(jS, s(iS) = ord(iS)=1; inc(cnt1); * Note: We loop over one element here loop(ijS(s,jS), * Break should not make a difference inc(cnt2); break; inc(cnt3); ); ); abort$(cnt1<>2) 'Error 35a'; abort$(cnt2<>2) 'Error 35b'; abort$(cnt3<>0) 'Error 35c';