export function whileReturn(): i32 {
  while (true) {
    return 1;
  }
}

assert(whileReturn() == 1);

export function whileThrow(): i32 {
  while (true) {
    throw new Error("term");
  }
}

export function whileContinue(): i32 {
  while (true) {
    continue;
  }
}

export function whileAny(a: i32): i32 {
  while (true) {
    if (a == 1) return 1;
    else if (a == 2) throw new Error("term");
    else continue;
  }
}

assert(whileAny(1) == 1);

export function forReturn(): i32 {
  for (;;) {
    return 1;
  }
}

assert(forReturn() == 1);

export function forThrow(): i32 {
  for (;;) {
    throw new Error("term");
  }
}

export function forContinue(): i32 {
  for (;;) {
    continue;
  }
}

export function forAny(a: i32): i32 {
  for (;;) {
    if (a == 1) return 1;
    else if (a == 2) throw new Error("term");
    else continue;
  }
}

assert(forAny(1) == 1);

export function doReturn(): i32 {
  do {
    return 1;
  } while (true);
}

assert(doReturn() == 1);

export function doThrow(): i32 {
  do {
    throw new Error("term");
  } while (true);
}

export function doAny(a: i32): i32 {
  do {
    if (a == 1) return 1;
    else if (a == 2) throw new Error("term");
    else continue;
  } while (true);
}

assert(doAny(1) == 1);