blob: 153f268710f92aaab8c438fb2cf70166f871b040 [file] [log] [blame]
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Dart test program for testing for statement.
// @dart = 2.9
import "package:expect/expect.dart";
// Test several variations of for loops:
// * With or without an initializer.
// * With or without a test.
// * With or without an update.
// * With or without a continue.
// * With or without a fall through exit from the body.
// * With or without a break.
// Note that some possibilities are infinite loops and so not tested.
// Combinations that do not have a break or a test but do have a
// fall through from the body or a continue will never exit the loop.
// Each loop test function sets a status containing a bit for each part of
// the loop that is present, and then clears the bit as that part of the
// loop is executed. The test expectation should be 0 (all present parts
// were executed), except for a few cases where an update expression is
// unreachable due to a break or return in the loop body.
const int INIT = 1;
const int TEST = 2;
const int UPDATE = 4;
const int CONTINUE = 8;
const int FALL = 16;
const int BREAK = 32;
var status;
void loop0() {
status = 0;
for (;;) {
return;
}
}
void loop1() {
status = INIT;
for (status &= ~INIT;;) {
return;
}
}
void loop2() {
status = TEST;
for (; (status &= ~TEST) != 0;) {
return;
}
}
void loop3() {
status = INIT | TEST;
for (status &= ~INIT; (status &= ~TEST) != 0;) {
return;
}
}
void loop4() {
status = UPDATE;
for (;; status &= ~UPDATE) {
return;
}
}
void loop5() {
status = INIT | UPDATE;
for (status &= ~INIT;; status &= ~UPDATE) {
return;
}
}
void loop6() {
status = TEST | UPDATE;
for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
return;
}
}
void loop7() {
status = INIT | TEST | UPDATE;
for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
return;
}
}
// Infinite loop not tested.
void loop8() {
status = CONTINUE;
for (;;) {
status &= ~CONTINUE;
continue;
}
}
// Infinite loop not tested.
void loop9() {
status = INIT | CONTINUE;
for (status &= ~INIT;;) {
status &= ~CONTINUE;
continue;
}
}
void loop10() {
status = TEST | CONTINUE;
for (; (status &= ~TEST) != 0;) {
status &= ~CONTINUE;
continue;
}
}
void loop11() {
status = INIT | TEST | CONTINUE;
for (status &= ~INIT; (status &= ~TEST) != 0;) {
status &= ~CONTINUE;
continue;
}
}
// Infinite loop.
void loop12() {
status = UPDATE | CONTINUE;
for (;; status &= ~UPDATE) {
status &= ~CONTINUE;
continue;
}
}
// Infinite loop.
void loop13() {
status = INIT | UPDATE | CONTINUE;
for (status &= ~INIT;; status &= ~UPDATE) {
status &= ~CONTINUE;
continue;
}
}
void loop14() {
status = TEST | UPDATE | CONTINUE;
for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
status &= ~CONTINUE;
continue;
}
}
void loop15() {
status = INIT | TEST | UPDATE | CONTINUE;
for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
status &= ~CONTINUE;
continue;
}
}
// Infinite loop.
void loop16() {
status = FALL;
for (;;) {
status &= ~FALL;
}
}
// Infinite loop.
void loop17() {
status = INIT | FALL;
for (status &= ~INIT;;) {
status &= ~FALL;
}
}
void loop18() {
status = TEST | FALL;
for (; (status &= ~TEST) != 0;) {
status &= ~FALL;
}
}
void loop19() {
status = INIT | TEST | FALL;
for (status &= ~INIT; (status &= ~TEST) != 0;) {
status &= ~FALL;
}
}
// Infinite loop.
void loop20() {
status = UPDATE | FALL;
for (;; status &= ~UPDATE) {
status &= ~FALL;
}
}
// Infinite loop.
void loop21() {
status = INIT | UPDATE | FALL;
for (status &= ~INIT;; status &= ~UPDATE) {
status &= ~FALL;
}
}
void loop22() {
status = TEST | UPDATE | FALL;
for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
status &= ~FALL;
}
}
void loop23() {
status = INIT | TEST | UPDATE | FALL;
for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
status &= ~FALL;
}
}
// Infinite loop.
void loop24() {
status = CONTINUE | FALL;
for (;;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~FALL;
}
}
// Infinite loop.
void loop25() {
status = INIT | CONTINUE | FALL;
for (status &= ~INIT;;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~FALL;
}
}
void loop26() {
status = TEST | CONTINUE | FALL;
for (; (status &= ~TEST) != 0;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~FALL;
}
}
void loop27() {
status = INIT | TEST | CONTINUE | FALL;
for (status &= ~INIT; (status &= ~TEST) != 0;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~FALL;
}
}
// Infinite loop.
void loop28() {
status = UPDATE | CONTINUE | FALL;
for (;; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~FALL;
}
}
// Infinite loop.
void loop29() {
status = INIT | UPDATE | CONTINUE | FALL;
for (status &= ~INIT;; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~FALL;
}
}
void loop30() {
status = TEST | UPDATE | CONTINUE | FALL;
for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~FALL;
}
}
void loop31() {
status = INIT | TEST | UPDATE | CONTINUE | FALL;
for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~FALL;
}
}
void loop32() {
status = BREAK;
for (;;) {
status &= ~BREAK;
break;
}
}
void loop33() {
status = INIT | BREAK;
for (status &= ~INIT;;) {
status &= ~BREAK;
break;
}
}
void loop34() {
status = TEST | BREAK;
for (; (status &= ~TEST) != 0;) {
status &= ~BREAK;
break;
}
}
void loop35() {
status = INIT | TEST | BREAK;
for (status &= ~INIT; (status &= ~TEST) != 0;) {
status &= ~BREAK;
break;
}
}
void loop36() {
status = UPDATE | BREAK;
for (;; status &= ~UPDATE) {
status &= ~BREAK;
break;
}
}
void loop37() {
status = INIT | UPDATE | BREAK;
for (status &= ~INIT;; status &= ~UPDATE) {
status &= ~BREAK;
break;
}
}
void loop38() {
status = TEST | UPDATE | BREAK;
for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
status &= ~BREAK;
break;
}
}
void loop39() {
status = INIT | TEST | UPDATE | BREAK;
for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
status &= ~BREAK;
break;
}
}
void loop40() {
status = CONTINUE | BREAK;
for (;;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~BREAK;
break;
}
}
void loop41() {
status = INIT | CONTINUE | BREAK;
for (status &= ~INIT;;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~BREAK;
break;
}
}
void loop42() {
status = TEST | CONTINUE | BREAK;
for (; (status &= ~TEST) != 0;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~BREAK;
break;
}
}
void loop43() {
status = INIT | TEST | CONTINUE | BREAK;
for (status &= ~INIT; (status &= ~TEST) != 0;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~BREAK;
break;
}
}
void loop44() {
status = UPDATE | CONTINUE | BREAK;
for (;; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~BREAK;
break;
}
}
void loop45() {
status = INIT | UPDATE | CONTINUE | BREAK;
for (status &= ~INIT;; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~BREAK;
break;
}
}
void loop46() {
status = TEST | UPDATE | CONTINUE | BREAK;
for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~BREAK;
break;
}
}
void loop47() {
status = INIT | TEST | UPDATE | CONTINUE | BREAK;
for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
status &= ~BREAK;
break;
}
}
void loop48() {
status = FALL | BREAK;
for (;;) {
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop49() {
status = INIT | FALL | BREAK;
for (status &= ~INIT;;) {
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop50() {
status = TEST | FALL | BREAK;
for (; (status &= ~TEST) != 0;) {
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop51() {
status = INIT | TEST | FALL | BREAK;
for (status &= ~INIT; (status &= ~TEST) != 0;) {
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop52() {
status = UPDATE | FALL | BREAK;
for (;; status &= ~UPDATE) {
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop53() {
status = INIT | UPDATE | FALL | BREAK;
for (status &= ~INIT;; status &= ~UPDATE) {
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop54() {
status = TEST | UPDATE | FALL | BREAK;
for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop55() {
status = INIT | TEST | UPDATE | FALL | BREAK;
for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop56() {
status = CONTINUE | FALL | BREAK;
for (;;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop57() {
status = INIT | CONTINUE | FALL | BREAK;
for (status &= ~INIT;;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop58() {
status = TEST | CONTINUE | FALL | BREAK;
for (; (status &= ~TEST) != 0;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop59() {
status = INIT | TEST | CONTINUE | FALL | BREAK;
for (status &= ~INIT; (status &= ~TEST) != 0;) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop60() {
status = UPDATE | CONTINUE | FALL | BREAK;
for (;; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop61() {
status = INIT | UPDATE | CONTINUE | FALL | BREAK;
for (status &= ~INIT;; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop62() {
status = TEST | UPDATE | CONTINUE | FALL | BREAK;
for (; (status &= ~TEST) != 0; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void loop63() {
status = INIT | TEST | UPDATE | CONTINUE | FALL | BREAK;
for (status &= ~INIT; (status &= ~TEST) != 0; status &= ~UPDATE) {
if ((status & CONTINUE) == CONTINUE) {
status &= ~CONTINUE;
continue;
}
if ((status & FALL) == FALL) {
status &= ~FALL;
} else {
status &= ~BREAK;
break;
}
}
}
void main() {
loop0();
Expect.equals(0, status);
loop1();
Expect.equals(0, status);
loop2();
Expect.equals(0, status);
loop3();
Expect.equals(0, status);
// The next four tests return with status UPDATE because they return
// before the update expression is reached.
loop4();
Expect.equals(UPDATE, status);
loop5();
Expect.equals(UPDATE, status);
loop6();
Expect.equals(UPDATE, status);
loop7();
Expect.equals(UPDATE, status);
loop10();
Expect.equals(0, status);
loop11();
Expect.equals(0, status);
loop14();
Expect.equals(0, status);
loop15();
Expect.equals(0, status);
loop18();
Expect.equals(0, status);
loop19();
Expect.equals(0, status);
loop22();
Expect.equals(0, status);
loop23();
Expect.equals(0, status);
loop26();
Expect.equals(0, status);
loop27();
Expect.equals(0, status);
loop30();
Expect.equals(0, status);
loop31();
Expect.equals(0, status);
loop32();
Expect.equals(0, status);
loop33();
Expect.equals(0, status);
loop34();
Expect.equals(0, status);
loop35();
Expect.equals(0, status);
// The next four tests return with status UPDATE because they break from
// the loop before the update expression is reached.
loop36();
Expect.equals(4, status);
loop37();
Expect.equals(4, status);
loop38();
Expect.equals(4, status);
loop39();
Expect.equals(4, status);
loop40();
Expect.equals(0, status);
loop41();
Expect.equals(0, status);
loop42();
Expect.equals(0, status);
loop43();
Expect.equals(0, status);
loop44();
Expect.equals(0, status);
loop45();
Expect.equals(0, status);
loop46();
Expect.equals(0, status);
loop47();
Expect.equals(0, status);
loop48();
Expect.equals(0, status);
loop49();
Expect.equals(0, status);
loop50();
Expect.equals(0, status);
loop51();
Expect.equals(0, status);
loop52();
Expect.equals(0, status);
loop53();
Expect.equals(0, status);
loop54();
Expect.equals(0, status);
loop55();
Expect.equals(0, status);
loop56();
Expect.equals(0, status);
loop57();
Expect.equals(0, status);
loop58();
Expect.equals(0, status);
loop59();
Expect.equals(0, status);
loop60();
Expect.equals(0, status);
loop61();
Expect.equals(0, status);
loop62();
Expect.equals(0, status);
loop63();
Expect.equals(0, status);
}