// Formatted problems:
//
// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:35:5: Error: Switch case may fall through to the next case.
//     case 2:  result = 2; /// static warning - case fall-through, see "Switch"
//     ^
//
// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:36:5: Error: Switch case may fall through to the next case.
//     case 3:  result = 3; /// static warning - case fall-through, see "Switch"
//     ^
//
// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:46:5: Error: Switch case may fall through to the next case.
//     case 1:
//     ^

// Unhandled errors:
//
// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:35:5: Error: Switch case may fall through to the next case.
//     case 2:  result = 2; /// static warning - case fall-through, see "Switch"
//     ^
//
// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:36:5: Error: Switch case may fall through to the next case.
//     case 3:  result = 3; /// static warning - case fall-through, see "Switch"
//     ^
//
// pkg/front_end/testcases/rasta/switch_execution_case_t02.dart:46:5: Error: Switch case may fall through to the next case.
//     case 1:
//     ^

library;
import self as self;
import "dart:core" as core;

static method test(dynamic value) → dynamic {
  dynamic result;
  #L1:
  switch(value) {
    #L2:
    case 1:
      {
        result = 1;
        break #L1;
      }
    #L3:
    case 2:
      {
        result = 2;
        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 35);
      }
    #L4:
    case 3:
      {
        result = 3;
        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 36);
      }
    #L5:
    default:
      {
        result = 4;
      }
  }
  return result;
}
static method testEmptyCases(dynamic value) → dynamic {
  dynamic result;
  #L6:
  switch(value) {
    #L7:
    case 1:
    case 2:
      {
        result = 1;
        throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 46);
      }
    #L8:
    case 3:
    case 4:
      {
        result = 2;
        break #L6;
      }
    #L9:
    case 5:
    case 6:
    default:
      {}
  }
  return result;
}
static method main() → dynamic {}
