library;
//
// Problems in library:
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:31:4: Error: Can't assign to the final variable 'initializedFinal'.
//   (initializedFinal, // Error
//    ^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:32:7: Error: Late final variable 'initializedLateFinal' definitely assigned.
//       initializedLateFinal, // Error
//       ^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:35:5: Error: Final variable 'definitelyAssignedFinal' might already be assigned at this point.
//     definitelyAssignedFinal] = y; // Error
//     ^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:36:17: Error: Late final variable 'definitelyAssignedLateFinal' definitely assigned.
//   Class(field1: definitelyAssignedLateFinal, // Error
//                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
// pkg/front_end/testcases/patterns/pattern_assignment_final.dart:37: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;
  block {
    dynamic #t1;
    final synthesized dynamic #0#0 = x as{TypeError,ForDynamic} (core::int, core::int, dynamic);
    if(!(#0#0 is (core::Object?, core::Object?, core::Object?) && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:31:4: Error: Can't assign to the final variable 'initializedFinal'.
  (initializedFinal, // Error
   ^^^^^^^^^^^^^^^^" && invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:32:7: Error: Late final variable 'initializedLateFinal' definitely assigned.
      initializedLateFinal, // Error
      ^^^^^^^^^^^^^^^^^^^^" && (let final dynamic #t2 = #t1 = #0#0{(core::Object?, core::Object?, core::Object?)}.$3{core::Object?} in true)))
      throw new core::StateError::•("Pattern matching error");
    definitelyUnassignedFinal = #t1;
  } =>#0#0;
  block {
    core::int #t3;
    final synthesized dynamic #1#0 = y as{TypeError,ForDynamic} core::List<core::int>;
    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 #t4 = #t3 = #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:35:5: Error: Final variable 'definitelyAssignedFinal' might already be assigned at this point.
    definitelyAssignedFinal] = y; // Error
    ^^^^^^^^^^^^^^^^^^^^^^^"))
      throw new core::StateError::•("Pattern matching error");
    definitelyUnassignedLateFinal = #t3;
  } =>#1#0;
  block {
    core::int #t5;
    final synthesized dynamic #2#0 = z as{TypeError,ForDynamic} self::Class;
    late final synthesized dynamic #2#3 = (#2#0 as{Unchecked} self::Class).{self::Class::field2}{dynamic};
    late final synthesized dynamic #2#9 = (#2#3 as{Unchecked} core::List<dynamic>).{core::List::[]}(0){(core::int) → dynamic};
    late final synthesized dynamic #2#16 = (#2#3 as{Unchecked} core::List<dynamic>).{core::List::[]}(1){(core::int) → dynamic};
    if(!(#2#0 is self::Class && (let final dynamic #t6 = #2#0{self::Class}.{self::Class::field1}{dynamic} in invalid-expression "pkg/front_end/testcases/patterns/pattern_assignment_final.dart:36:17: Error: Late final variable 'definitelyAssignedLateFinal' definitely assigned.
  Class(field1: definitelyAssignedLateFinal, // Error
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#3 is core::List<dynamic> && #2#3{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (#2#9 is core::List<dynamic> && #2#9{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:37:17: Error: Final variable 'notDefinitelyAssignedFinal' might already be assigned at this point.
      field2: [[notDefinitelyAssignedFinal, _], // Error
                ^^^^^^^^^^^^^^^^^^^^^^^^^^") && (#2#16 is core::List<dynamic> && #2#16{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t7 = #t5 = #2#16{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic} as core::int in true)))))
      throw new core::StateError::•("Pattern matching error");
    notDefinitelyAssignedLateFinal = #t5;
  } =>#2#0;
}

constants  {
  #C1 = 2
}
