library;
//
// Problems in library:
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:34:4: Error: Can't assign to the final variable 'initializedFinal'.
//   (initializedFinal, // Error
//    ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:35:7: Error: Can't assign to the final variable 'initializedLateFinal'.
//       initializedLateFinal, // Error
//       ^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:38:5: Error: Final variable 'definitelyAssignedFinal' might already be assigned at this point.
//     definitelyAssignedFinal] = y; // Error
//     ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:39:17: Error: Late final variable 'definitelyAssignedLateFinal' definitely assigned.
//   Class(field1: definitelyAssignedLateFinal, // Error
//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:40:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point.
//       field2: [[notDefinitelyAssignedFinal, _], // Error
//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
//
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 {
  final core::int initializedFinal = 5;
  late final core::int initializedLateFinal = 5;
  final dynamic definitelyUnassignedFinal;
  late final core::int definitelyUnassignedLateFinal;
  final dynamic definitelyAssignedFinal;
  late final dynamic definitelyAssignedLateFinal;
  final core::int notDefinitelyAssignedFinal;
  late final core::int notDefinitelyAssignedLateFinal;
  if(x =={core::Object::==}{(core::Object) → core::bool} 5) {
    notDefinitelyAssignedFinal = 5;
    notDefinitelyAssignedLateFinal = 15;
  }
  definitelyAssignedFinal = 10;
  definitelyAssignedLateFinal = 20;
  {
    final synthesized dynamic #0#0 = x as{TypeError,ForDynamic} (invalid-type, invalid-type, dynamic);
    if(!(#0#0 is (core::Object?, core::Object?, core::Object?) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:34:4: Error: Can't assign to the final variable 'initializedFinal'.
  (initializedFinal, // Error
   ^^^^^^^^^^^^^^^^" && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:35:7: Error: Can't assign to the final variable 'initializedLateFinal'.
      initializedLateFinal, // Error
      ^^^^^^^^^^^^^^^^^^^^" && (let final dynamic #t1 = definitelyUnassignedFinal = #0#0{(core::Object?, core::Object?, core::Object?)}.$3{core::Object?} in true)))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
  {
    final synthesized dynamic #1#0 = y as{TypeError,ForDynamic} core::List<core::int>;
    final const synthesized core::int #1#3 = #C1;
    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 = definitelyUnassignedLateFinal = #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} as core::int in true) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:38:5: Error: Final variable 'definitelyAssignedFinal' might already be assigned at this point.
    definitelyAssignedFinal] = y; // Error
    ^^^^^^^^^^^^^^^^^^^^^^^"))
      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;
    final const synthesized core::int #2#6 = #C1;
    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 = #2#0{self::Class}.{self::Class::field1}{dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:39:17: Error: Late final variable 'definitelyAssignedLateFinal' definitely assigned.
  Class(field1: definitelyAssignedLateFinal, // Error
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^") && ((#2#3#isSet ?{dynamic} #2#3 : 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 : 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 : let final dynamic #t6 = #2#9#isSet = true in #2#9 = ((#2#3#isSet ?{dynamic} #2#3 : 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 : let final dynamic #t8 = #2#9#isSet = true in #2#9 = ((#2#3#isSet ?{dynamic} #2#3 : 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 "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:40:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point.
      field2: [[notDefinitelyAssignedFinal, _], // Error
                ^^^^^^^^^^^^^^^^^^^^^^^^^^") && ((#2#16#isSet ?{dynamic} #2#16 : let final dynamic #t10 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3 : 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 : let final dynamic #t12 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3 : 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 && (let final dynamic #t14 = notDefinitelyAssignedLateFinal = ((#2#16#isSet ?{dynamic} #2#16 : let final dynamic #t15 = #2#16#isSet = true in #2#16 = ((#2#3#isSet ?{dynamic} #2#3 : let final dynamic #t16 = #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::[]}(1){(core::int) → dynamic} as core::int in true)))))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
}

constants  {
  #C1 = 2
}
