// 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);
}
