library /*isNonNullableByDefault*/;
//
// 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:45:11: 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:45:16: Context: The first rest element.
//     case {..., ...}: // 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:50: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:50: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:56: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:62: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:66:15: Error: The '...' pattern can appear only at the end in map patterns.
//   if (o case {..., 5: 3}) { // Error
//               ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:72:21: Error: A rest element in a map pattern can't have a subpattern.
// Try removing the subpattern.
//   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 {
  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 {
    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 #t1 = a = #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");
  } =>#0#0;
}
static method duplicateRecordPatternField(dynamic o) → dynamic {
  #L3:
  {
    final synthesized dynamic #0#0 = o;
    late final synthesized core::int #0#2 = #0#0{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{ForNonNullableByDefault} self::Class && #C2 =={core::num::==}{(core::Object) → core::bool} #0#2 && (let final dynamic #t2 = #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{ForNonNullableByDefault} 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
               ^" || #0#0 is{ForNonNullableByDefault} core::Map<dynamic, dynamic>) {
      }
    }
  }
}
static method matchedTypeIsStrictlyNonNullable(core::List<core::int> list) → dynamic {
  {
    core::int a;
    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 #t3 = #0#4! in let final dynamic #t4 = a = #0#4! in true) && (!(#0#6 == null) ?{core::bool} let final dynamic #t5 = 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:56: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 {
  core::int a;
  {
    final synthesized dynamic #0#0 = x;
    if(!(!(#0#0 == null) ?{core::bool} let final dynamic #t6 = 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{ForNonNullableByDefault} core::Map<dynamic, dynamic> && #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool} && #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{ForNonNullableByDefault} core::Map<dynamic, dynamic> && #0#0{core::Map<dynamic, dynamic>}.{core::Map::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool} && #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
}
