library;
//
// Problems in library:
//
// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:11: Error: Variable 'b' can't be declared in a pattern assignment.
// Try using a preexisting variable or changing the assignment to a pattern variable declaration.
//   (a, int b, final int c) = x;
//           ^
//
// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:12:24: Error: Variable 'c' can't be declared in a pattern assignment.
// Try using a preexisting variable or changing the assignment to a pattern variable declaration.
//   (a, int b, final int c) = x;
//                        ^
//
// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:13:13: Error: Variable 'd' can't be declared in a pattern assignment.
// Try using a preexisting variable or changing the assignment to a pattern variable declaration.
//   [a, final d] = y;
//             ^
//
// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:34: Error: Variable 'e' can't be declared in a pattern assignment.
// Try using a preexisting variable or changing the assignment to a pattern variable declaration.
//   Class(field1: a, field2: [[var e, _], [1, var f]]) = z;
//                                  ^
//
// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:49: Error: Variable 'f' can't be declared in a pattern assignment.
// Try using a preexisting variable or changing the assignment to a pattern variable declaration.
//   Class(field1: a, field2: [[var e, _], [1, var f]]) = z;
//                                                 ^
//
// pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context.
// Try using an if-case, a 'switch' statement, or a 'switch' expression instead.
//   Class(field1: a, field2: [[var e, _], [1, var f]]) = z;
//                                          ^
//
import self as self;
import "dart:core" as core;

class Class extends core::Object {
  field dynamic field1 = null;
  field dynamic field2 = null;
  synthetic constructor •() → self::Class
    : super core::Object::•()
    ;
}
static method method(dynamic x, dynamic y, dynamic z) → dynamic {
  dynamic a;
  {
    final synthesized dynamic #0#0 = x as{TypeError,ForDynamic} (dynamic, invalid-type, invalid-type);
    if(!(#0#0 is (core::Object?, core::Object?, core::Object?) && (let final dynamic #t1 = a = #0#0{(core::Object?, core::Object?, core::Object?)}.$1{core::Object?} in true) && invalid-expression "declared variable pattern in assignment" && invalid-expression "declared variable pattern in assignment"))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
  {
    final synthesized dynamic #1#0 = y as{TypeError,ForDynamic} core::List<invalid-type>;
    if(!(#1#0 is core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t2 = a = #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true) && invalid-expression "declared variable pattern in assignment"))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
  {
    final synthesized dynamic #2#0 = z as{TypeError,ForDynamic} self::Class;
    synthesized dynamic #2#3;
    synthesized core::bool #2#3#isSet = false;
    synthesized dynamic #2#9;
    synthesized core::bool #2#9#isSet = false;
    synthesized dynamic #2#16;
    synthesized core::bool #2#16#isSet = false;
    if(!(#2#0 is self::Class && (let final dynamic #t3 = a = #2#0{self::Class}.{self::Class::field1}{dynamic} in true) && ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t4 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) is core::List<dynamic> && ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t5 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && ((#2#9#isSet ?{dynamic} #2#9{dynamic} : let final dynamic #t6 = #2#9#isSet = true in #2#9 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t7 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(0){(core::int) → dynamic}) is core::List<dynamic> && ((#2#9#isSet ?{dynamic} #2#9{dynamic} : let final dynamic #t8 = #2#9#isSet = true in #2#9 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t9 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(0){(core::int) → dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && invalid-expression "declared variable pattern in assignment") && ((#2#16#isSet ?{dynamic} #2#16{dynamic} : let final dynamic #t10 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t11 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic}) is core::List<dynamic> && ((#2#16#isSet ?{dynamic} #2#16{dynamic} : let final dynamic #t12 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3{dynamic} : let final dynamic #t13 = #2#3#isSet = true in #2#3 = #2#0{self::Class}.{self::Class::field2}{dynamic}) as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic}) as{Unchecked} core::List<dynamic>).{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_declares.dart:14:42: Error: Refutable patterns can't be used in an irrefutable context.
Try using an if-case, a 'switch' statement, or a 'switch' expression instead.
  Class(field1: a, field2: [[var e, _], [1, var f]]) = z;
                                         ^" && invalid-expression "declared variable pattern in assignment"))))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
}

constants  {
  #C1 = 2
}
