library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "package:expect/expect.dart" as exp;

import "package:expect/expect.dart";

static const field core::int var1 = #C1;
static const field core::int var2 = #C2;
static const field core::int var3 = #C3;
static const field core::int var4 = #C4;
static const field core::int var5 = #C5;
static const field core::int var6 = #C1;
static const field core::int var7 = #C6;
static const field core::int var8 = #C2;
static const field core::int var9 = #C7;
static const field core::int var10 = #C8;
static method fn(core::int a) → core::int {
  core::int b = a;
  for (core::int i = 0; i.{core::num::<}(2); i = i.{core::num::+}(1)) {
    b = b.{core::num::+}(a);
  }
  return b;
}
static method fn1(core::int a) → core::int {
  core::int b = a;
  for (core::int i = 0; ; i = i.{core::num::+}(1)) {
    b = b.{core::num::*}(3);
    if(b.{core::num::>}(10))
      return b;
  }
}
static method fn2() → core::int {
  for (core::int i = 0, core::int j = 2; ; i = i.{core::num::+}(2), j = j.{core::num::+}(1)) {
    if(i.{core::num::+}(j).{core::num::>}(10)) {
      return i.{core::num::+}(j);
    }
  }
}
static method fnContinue() → core::int {
  core::int a = 0;
  for (core::int i = 0; i.{core::num::<}(5); i = i.{core::num::+}(1))
    #L1:
    {
      if(i.{core::num::%}(2).{core::num::==}(1))
        break #L1;
      a = a.{core::num::+}(i);
    }
  return a;
}
static method fnBreak(core::int a) → core::int {
  core::int b = a;
  #L2:
  for (core::int i = 0; i.{core::num::<}(2); i = i.{core::num::+}(1)) {
    if(b.{core::num::==}(2))
      break #L2;
    b = b.{core::num::+}(a);
  }
  return b;
}
static method fnNestedFor() → core::int {
  core::int a = 0;
  for (; ; ) {
    #L3:
    for (; ; ) {
      break #L3;
    }
    return 1;
  }
}
static method fnBreakLabel() → core::int {
  #L4:
  for (; ; ) {
    for (; ; ) {
      break #L4;
    }
  }
  return 3;
}
static method main() → void {
  exp::Expect::equals(#C1, 6);
  exp::Expect::equals(#C2, 9);
  exp::Expect::equals(#C3, 18);
  exp::Expect::equals(#C4, 27);
  exp::Expect::equals(#C5, 11);
  exp::Expect::equals(#C1, 6);
  exp::Expect::equals(#C6, 2);
  exp::Expect::equals(#C2, 9);
  exp::Expect::equals(#C7, 1);
  exp::Expect::equals(#C8, 3);
}

constants  {
  #C1 = 6
  #C2 = 9
  #C3 = 18
  #C4 = 27
  #C5 = 11
  #C6 = 2
  #C7 = 1
  #C8 = 3
}
