library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;

static method foo() → dynamic {
  try {
    return;
  }
  finally {
    core::print("Hello from finally block!");
  }
}
static method bar(dynamic d) → dynamic async* {
  await for (dynamic x in d as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<dynamic>) {
    yield x;
    yield* x as{TypeError,ForDynamic,ForNonNullableByDefault} asy::Stream<dynamic>;
  }
}
static method main() → dynamic {
  do {
    core::print("Hello from do-while!");
  }
  while (false)
  do {
    void x = core::print("Hello from do-while!");
  }
  while (false)
  for (core::String s in <core::String>["Hello from for-in!"]) {
    core::print(s);
  }
  for (core::String s in <core::String>["Hello from for-in without block!"])
    core::print(s);
  dynamic s;
  for (final dynamic #t1 in <dynamic>["Hello from for-in without decl!"]) {
    s = #t1;
    core::print(s);
  }
  for (final dynamic #t2 in <dynamic>["Hello from for-in without decl and block!"]) {
    s = #t2;
    core::print(s);
  }
  core::print("Hello from labeled statement!");
  try {
    try {
      throw "Hello from rethrow!";
    }
    on core::Object catch(final core::Object e) {
      rethrow;
    }
  }
  on core::Object catch(final core::Object e) {
    core::print(e);
  }
  self::foo();
  core::bool done = false;
  while (!done) {
    done = true;
    core::print("Hello from while!");
  }
  ;
  assert(true);
  assert(true, "Hello from assert!");
  try {
    assert(false, "Hello from assert!");
  }
  on core::Object catch(final core::Object e) {
    core::print(e);
  }
  #L1:
  switch(1) {
    #L2:
    case #C1:
    case #C2:
      {
        core::print("Hello from switch case!");
        break #L1;
      }
    #L3:
    default:
      {
        break #L1;
      }
  }
  #L4:
  switch(4) {
    #L5:
    case #C2:
      {
        core::print("Hello from case 2!");
        break #L4;
      }
    #L6:
    case #C1:
      {
        core::print("Hello from case 1!");
        continue #L5;
      }
    #L7:
    case #C3:
      {
        core::print("Hello from case 0!");
        continue #L6;
      }
    #L8:
    case #C4:
      {
        core::print("Hello from case 4!");
        continue #L9;
      }
    #L9:
    default:
      {
        continue #L7;
      }
  }
  #L10:
  switch(4) {
    #L11:
    case #C1:
      {
        core::print("Hello from next case 1");
        break #L10;
      }
    #L12:
    default:
      {
        continue #L11;
      }
  }
  core::int i = 0;
  #L13:
  do
    #L14:
    {
      core::print("Hello from do-while!");
      if((i = i.{core::num::+}(1){(core::num) → core::int}).{core::num::<}(3){(core::num) → core::bool})
        break #L14;
      break #L13;
    }
  while (true)
  i = 0;
  #L15:
  while (true)
    #L16:
    {
      core::print("Hello from while!");
      if((i = i.{core::num::+}(1){(core::num) → core::int}).{core::num::<}(3){(core::num) → core::bool})
        break #L16;
      break #L15;
    }
}

constants  {
  #C1 = 1
  #C2 = 2
  #C3 = 0
  #C4 = 4
}
