library;
//
// Problems in library:
//
// pkg/front_end/testcases/general_nnbd_opt_out/statements.dart:17:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
//     yield x;
//     ^^^^^
//
// pkg/front_end/testcases/general_nnbd_opt_out/statements.dart:18:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
//     yield* x;
//     ^^^^^
//
// pkg/front_end/testcases/general_nnbd_opt_out/statements.dart:16:23: Error: The type 'List<dynamic>' used in the 'for' loop must implement 'Stream<dynamic>'.
//  - 'List' is from 'dart:core'.
//  - 'Stream' is from 'dart:async'.
//   await for (var x in []) {
//                       ^
//
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 async {
  await for (dynamic x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/statements.dart:16:23: Error: The type 'List<dynamic>' used in the 'for' loop must implement 'Stream<dynamic>'.
 - 'List' is from 'dart:core'.
 - 'Stream' is from 'dart:async'.
  await for (var x in []) {
                      ^" in <dynamic>[] as{TypeError} asy::Stream<dynamic>*) {
    yield x;
    yield* x;
  }
}
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 #t2 in <dynamic>["Hello from for-in without decl!"]) {
    s = #t2;
    core::print(s);
  }
  for (final dynamic #t3 in <dynamic>["Hello from for-in without decl and block!"]) {
    s = #t3;
    core::print(s);
  }
  core::print("Hello from labeled statement!");
  try {
    try {
      throw "Hello from rethrow!";
    }
    on dynamic catch(final dynamic e) {
      rethrow;
    }
  }
  on dynamic catch(final dynamic 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 dynamic catch(final dynamic 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::<}(3))
        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::<}(3))
        break #L16;
      break #L15;
    }
}

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