library;
//
// Problems in library:
//
// pkg/front_end/testcases/patterns/shared_errors.dart:16: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:23: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:29: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:34: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:34:4: Context: The first assigned variable pattern.
//   [a, a] = list; // Error
//    ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:39: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:39:18: Context: The first field.
//     case (field: 1, field: 2): // Error
//                  ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:40: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:40:23: Context: The first field.
//     case Class(field: 1, field: 2): // Error
//                       ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:47: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:47:11: Context: The first rest element.
//     case [..., ...]: // Error
//           ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:48:11: Error: The '...' pattern can't appear in map patterns.
//     case {..., ...}: // Error
//           ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:48:16: Error: The '...' pattern can't appear in map patterns.
//     case {..., ...}: // Error
//                ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:54: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:60:11: Error: The '...' pattern can't appear in map patterns.
//     case {...}: // Error
//           ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:71: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:77: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:81:15: Error: The '...' pattern can't appear in map patterns.
//   if (o case {..., 5: 3}) { // Error
//               ^
//
// pkg/front_end/testcases/patterns/shared_errors.dart:87: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 {
  {
    final synthesized self::Class #0#0 = cls;
    {
      if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:16: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 {
  {
    final synthesized self::Class #0#0 = cls;
    {
      if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:23: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 core::List<core::String> #0#0 = list;
    if(!invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:29: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{for-error-handling} new core::StateError::•("Pattern matching error");
  }
}
static method duplicateAssignmentPatternVariable(core::List<core::String> list) → dynamic {
  core::String a = "";
  {
    final synthesized core::List<core::String> #0#0 = list;
    final const synthesized core::int #0#2 = #C1;
    if(!(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t1 = a = #0#0.{core::List::[]}(0){(core::int) → core::String} in true) && invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:34:7: Error: The variable 'a' is already assigned in this pattern.
Try renaming the variable.
  [a, a] = list; // Error
      ^"))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
}
static method duplicateRecordPatternField(dynamic o) → dynamic {
  {
    final synthesized dynamic #0#0 = o;
    final const synthesized core::int #0#3 = #C2;
    synthesized core::int #0#2;
    synthesized core::bool #0#2#isSet = false;
    {
      if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:39: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#isSet ?{core::int} #0#2 : let final dynamic #t2 = #0#2#isSet = true in #0#2 = #0#0{self::Class}.{self::Class::field}{core::int}) && (let final dynamic #t3 = #0#2#isSet ?{core::int} #0#2 : let final dynamic #t4 = #0#2#isSet = true in #0#2 = #0#0{self::Class}.{self::Class::field}{core::int} in invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:40: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 {
  {
    final synthesized dynamic #0#0 = o;
    final const synthesized core::int #0#3 = #C2;
    {
      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:47: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:48:11: Error: The '...' pattern can't appear in map patterns.
    case {..., ...}: // Error
          ^") {
      }
    }
  }
}
static method emptyMapPattern(dynamic o) → dynamic {
  {
    final synthesized dynamic #0#0 = o;
    {
      if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:54: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 {
  {
    final synthesized dynamic #0#0 = o;
    {
      if(invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:60:11: Error: The '...' pattern can't appear in map patterns.
    case {...}: // Error
          ^") {
      }
    }
  }
}
static method matchedTypeIsStrictlyNonNullable(core::List<core::int> list) → dynamic {
  {
    final synthesized core::List<core::int> #0#0 = list;
    final const synthesized core::int #0#2 = #C1;
    synthesized core::int #0#4;
    synthesized core::bool #0#4#isSet = false;
    synthesized core::int #0#6;
    synthesized core::bool #0#6#isSet = false;
    {
      hoisted core::int a;
      hoisted core::int b;
      if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t5 = (#0#4#isSet ?{core::int} #0#4 : let final dynamic #t6 = #0#4#isSet = true in #0#4 = #0#0.{core::List::[]}(0){(core::int) → core::int})! in let final dynamic #t7 = a = (#0#4#isSet ?{core::int} #0#4 : let final dynamic #t8 = #0#4#isSet = true in #0#4 = #0#0.{core::List::[]}(0){(core::int) → core::int})! in true) && !((#0#6#isSet ?{core::int} #0#6 : let final dynamic #t9 = #0#6#isSet = true in #0#6 = #0#0.{core::List::[]}(1){(core::int) → core::int}) == null)) {
        b = #0#6#isSet ?{core::int} #0#6 : let final dynamic #t10 = #0#6#isSet = true in #0#6 = #0#0.{core::List::[]}(1){(core::int) → core::int};
        {
          core::print(0);
        }
      }
    }
  }
}
static method nonBooleanCondition(core::int i) → dynamic {
  {
    final synthesized core::int #0#0 = i;
    final const synthesized core::int #0#1 = #C3;
    if(#C3 =={core::num::==}{(core::Object) → core::bool} #0#0 && invalid-expression "pkg/front_end/testcases/patterns/shared_errors.dart:71: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 core::int? #0#0 = x;
    if(!(!(#0#0 == null) && (let final dynamic #t11 = a = #0#0{core::int} in true)))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
}
static method restPatternNotLastInMap(dynamic o) → dynamic {
  {
    final synthesized dynamic #0#0 = o;
    synthesized dynamic #0#4;
    synthesized core::bool #0#4#isSet = false;
    final const synthesized core::int #0#2 = #C4;
    final const synthesized core::int #0#5 = #C5;
    if(#0#0 is core::Map<dynamic, dynamic> && (!((#0#4#isSet ?{dynamic} #0#4 : let final dynamic #t12 = #0#4#isSet = true in #0#4 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic}) == null) || null is dynamic && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool}) && #C5 =={core::num::==}{(core::Object) → core::bool} (#0#4#isSet ?{dynamic} #0#4 : let final dynamic #t13 = #0#4#isSet = true in #0#4 = #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;
    synthesized dynamic #0#4;
    synthesized core::bool #0#4#isSet = false;
    final const synthesized core::int #0#2 = #C4;
    final const synthesized core::int #0#5 = #C5;
    if(#0#0 is core::Map<dynamic, dynamic> && (!((#0#4#isSet ?{dynamic} #0#4 : let final dynamic #t14 = #0#4#isSet = true in #0#4 = #0#0{core::Map<dynamic, dynamic>}.{core::Map::[]}(#C4){(core::Object?) → dynamic}) == null) || null is dynamic && #0#0{core::Map<dynamic, dynamic>}.{core::Map::containsKey}(#C4){(core::Object?) → core::bool}) && #C5 =={core::num::==}{(core::Object) → core::bool} (#0#4#isSet ?{dynamic} #0#4 : let final dynamic #t15 = #0#4#isSet = true in #0#4 = #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
}
