library;
//
// Problems in library:
//
// pkg/front_end/testcases/patterns/shared_errors.dart:13:13: Error: The argument type 'int' can't be assigned to the parameter type 'Class'.
//  - 'Class' is from 'pkg/front_end/testcases/patterns/shared_errors.dart'.
//     case >= 0: // Error
//             ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:20:10: Error: A value of type 'Class' can't be assigned to a variable of type 'bool'.
//  - 'Class' is from 'pkg/front_end/testcases/patterns/shared_errors.dart'.
//     case > 0: // Error
//          ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:26:12: Error: The matched value of type 'List<String>' isn't assignable to the required type 'List<int>'.
//  - 'List' is from 'dart:core'.
// Try changing the required type of the pattern, or the matched value type.
//   var <int>[a] = list; // Error
//            ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:31:7: Error: The variable 'a' is already assigned in this pattern.
// Try renaming the variable.
//   [a, a] = list; // Error
//       ^
// pkg/front_end/testcases/patterns/shared_errors.dart:31:4: Context: The first assigned variable pattern.
//   [a, a] = list; // Error
//    ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:36:28: Error: The field 'field' is already matched in this pattern.
// Try removing the duplicate field.
//     case (field: 1, field: 2): // Error
//                            ^
// pkg/front_end/testcases/patterns/shared_errors.dart:36:18: Context: The first field.
//     case (field: 1, field: 2): // Error
//                  ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:37:33: Error: The field 'field' is already matched in this pattern.
// Try removing the duplicate field.
//     case Class(field: 1, field: 2): // Error
//                                 ^
// pkg/front_end/testcases/patterns/shared_errors.dart:37:23: Context: The first field.
//     case Class(field: 1, field: 2): // Error
//                       ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:44:16: Error: At most one rest element is allowed in a list or map pattern.
// Try removing the duplicate rest element.
//     case [..., ...]: // Error
//                ^
// pkg/front_end/testcases/patterns/shared_errors.dart:44:11: Context: The first rest element.
//     case [..., ...]: // Error
//           ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:45:11: Error: The '...' pattern can't appear in map patterns.
//     case {..., ...}: // Error
//           ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:45:16: Error: The '...' pattern can't appear in map patterns.
//     case {..., ...}: // Error
//                ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:51:10: Error: A map pattern must have at least one entry.
// Try replacing it with an object pattern 'Map()'.
//     case {}: // Error
//          ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:57:11: Error: The '...' pattern can't appear in map patterns.
//     case {...}: // Error
//           ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:62:23: Warning: The null-assert pattern will have no effect because the matched type isn't nullable.
// Try replacing the null-assert pattern with its nested pattern.
//   if (list case [var a!, var b?]) { // Warnings
//                       ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:62:31: Warning: The null-check pattern will have no effect because the matched type isn't nullable.
// Try replacing the null-check pattern with its nested pattern.
//   if (list case [var a!, var b?]) { // Warnings
//                               ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:68:21: Error: Conditions must have a static type of 'bool'.
// Try changing the condition.
//   if (i case 0 when i) { // Error
//                     ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:74:9: Error: Refutable patterns can't be used in an irrefutable context.
// Try using an if-case, a 'switch' statement, or a 'switch' expression instead.
//   var (a?) = x; // Error
//         ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:78:15: Error: The '...' pattern can't appear in map patterns.
//   if (o case {..., 5: 3}) { // Error
//               ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:84:21: Error: The '...' pattern can't appear in map patterns.
//   if (o case {5: 3, ...var a}) { // Error
//                     ^
//
import self as self;
import "dart:core" as core;

class Class extends core::Object {
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
  get field() → core::int
    return 42;
  operator >=(self::Class cls) → core::bool
    return true;
  operator >(core::int i) → self::Class
    return new self::Class::•();
}
static method argumentTypeNotAssignable(self::Class cls) → dynamic {
  #L1:
  {
    final synthesized self::Class #0#0 = cls;
    {
      if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:13:13: Error: The argument type 'int' can't be assigned to the parameter type 'Class'.
 - 'Class' is from 'pkg/front_end/testcases/patterns/shared_errors.dart'.
    case >= 0: // Error
            ^") {
        {
          core::print(0);
        }
      }
    }
  }
}
static method relationalPatternOperatorReturnTypeNotAssignableToBool(self::Class cls) → dynamic {
  #L2:
  {
    final synthesized self::Class #0#0 = cls;
    {
      if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:20:10: Error: A value of type 'Class' can't be assigned to a variable of type 'bool'.
 - 'Class' is from 'pkg/front_end/testcases/patterns/shared_errors.dart'.
    case > 0: // Error
         ^") {
        {
          core::print(0);
        }
      }
    }
  }
}
static method patternTypeMismatchInIrrefutableContext(core::List<core::String> list) → dynamic {
  has-declared-initializer core::int a;
  {
    final synthesized dynamic #0#0 = list;
    if(!invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:26:12: Error: The matched value of type 'List<String>' isn't assignable to the required type 'List<int>'.
 - 'List' is from 'dart:core'.
Try changing the required type of the pattern, or the matched value type.
  var <int>[a] = list; // Error
           ^")
      throw new core::StateError::•("Pattern matching error");
  }
}
static method duplicateAssignmentPatternVariable(core::List<core::String> list) → dynamic {
  core::String a = "";
  block {
    core::String #t1;
    final synthesized dynamic #0#0 = list;
    if(!(#0#0{core::List<core::String>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = #t1 = #0#0{core::List<core::String>}.{core::List::[]}(0){(core::int) → core::String} in true) && invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:31:7: Error: The variable 'a' is already assigned in this pattern.
Try renaming the variable.
  [a, a] = list; // Error
      ^"))
      throw new core::StateError::•("Pattern matching error");
    a = #t1;
  } =>#0#0;
}
static method duplicateRecordPatternField(dynamic o) → dynamic {
  #L3:
  {
    final synthesized dynamic #0#0 = o;
    late final synthesized core::int #0#2 = (#0#0 as{Unchecked} self::Class).{self::Class::field}{core::int};
    {
      if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:36:28: Error: The field 'field' is already matched in this pattern.
Try removing the duplicate field.
    case (field: 1, field: 2): // Error
                           ^" || #0#0 is self::Class && #C2 =={core::num::==}{(core::Object) → core::bool} #0#2 && (let final dynamic #t3 = #0#2 in invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:37:33: Error: The field 'field' is already matched in this pattern.
Try removing the duplicate field.
    case Class(field: 1, field: 2): // Error
                                ^")) {
        {
          core::print(0);
        }
      }
    }
  }
}
static method duplicateRestPattern(dynamic o) → dynamic {
  #L4:
  {
    final synthesized dynamic #0#0 = o;
    {
      if(#0#0 is core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool} && invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:44:16: Error: At most one rest element is allowed in a list or map pattern.
Try removing the duplicate rest element.
    case [..., ...]: // Error
               ^" || invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:45:11: Error: The '...' pattern can't appear in map patterns.
    case {..., ...}: // Error
          ^") {
      }
    }
  }
}
static method emptyMapPattern(dynamic o) → dynamic {
  #L5:
  {
    final synthesized dynamic #0#0 = o;
    {
      if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:51:10: Error: A map pattern must have at least one entry.
Try replacing it with an object pattern 'Map()'.
    case {}: // Error
         ^") {
      }
    }
  }
}
static method singleRestPatternInMap(dynamic o) → dynamic {
  #L6:
  {
    final synthesized dynamic #0#0 = o;
    {
      if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:57:11: Error: The '...' pattern can't appear in map patterns.
    case {...}: // Error
          ^") {
      }
    }
  }
}
static method matchedTypeIsStrictlyNonNullable(core::List<core::int> list) → dynamic {
  {
    hoisted core::int a;
    hoisted core::int b;
    final synthesized core::List<core::int> #0#0 = list;
    late final synthesized core::int #0#4 = #0#0.{core::List::[]}(0){(core::int) → core::int};
    late final synthesized core::int #0#6 = #0#0.{core::List::[]}(1){(core::int) → core::int};
    if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t4 = #0#4! in let final dynamic #t5 = a = #0#4! in true) && (!(#0#6 == null) ?{core::bool} let final dynamic #t6 = b = #0#6 in true : false)) {
      core::print(0);
    }
  }
}
static method nonBooleanCondition(core::int i) → dynamic {
  {
    final synthesized core::int #0#0 = i;
    if(#C3 =={core::num::==}{(core::Object) → core::bool} #0#0 && invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:68:21: Error: Conditions must have a static type of 'bool'.
Try changing the condition.
  if (i case 0 when i) { // Error
                    ^") {
      core::print(0);
    }
  }
}
static method refutablePatternInIrrefutableContext(core::int? x) → dynamic {
  hoisted has-declared-initializer core::int a;
  {
    final synthesized dynamic #0#0 = x;
    if(!(!(#0#0 == null) ?{core::bool} let final dynamic #t7 = a = #0#0{core::int} in true : false))
      throw new core::StateError::•("Pattern matching error");
  }
}
static method restPatternNotLastInMap(dynamic o) → dynamic {
  {
    final synthesized dynamic #0#0 = o;
    if(#0#0 is core::Map<dynamic, dynamic> && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool} && #C5 =={core::num::==}{(core::Object) → core::bool} #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic}) {
      core::print(0);
    }
  }
}
static method restPatternWithSubPatternInMap(dynamic o) → dynamic {
  {
    final synthesized dynamic #0#0 = o;
    if(#0#0 is core::Map<dynamic, dynamic> && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool} && #C5 =={core::num::==}{(core::Object) → core::bool} #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic}) {
      core::print(0);
    }
  }
}

constants  {
  #C1 = 2
  #C2 = 1
  #C3 = 0
  #C4 = 5
  #C5 = 3
}
