library;
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* /* emittedValueType= dynamic */ {
  await for (dynamic x in d as{TypeError,ForDynamic} asy::Stream<dynamic>) {
    yield x;
    yield* x as{TypeError,ForDynamic} 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) /* core::int */ {
    #L2:
    case #C1:
    case #C2:
      {
        core::print("Hello from switch case!");
        break #L1;
      }
    #L3:
    default:
      {
        break #L1;
      }
  }
  #L4:
  switch(4) /* core::int */ {
    #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) /* core::int */ {
    #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
}
