library;
//
// Problems in library:
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:7:32: Error: Can't assign to the final variable 'i'.
//   for (final int i = 0; i < 3; i = i + 1) {
//                                ^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:11:34: Error: Can't assign to the final variable 'i'.
//   for (final (int i) = 0; i < 3; i = i + 1) {
//                                  ^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:14:13: Error: Variable patterns in declaration context can't specify 'var' or 'final' keyword.
// Try removing the keyword.
//   for (var (final int i, String s) = (0, ''); i < 3; i = i + 1) {
//             ^^^^^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:17:20: Error: Variable patterns in declaration context can't specify 'var' or 'final' keyword.
// Try removing the keyword.
//   for (var (int i, final String s) = (0, ''); i < 3; i = i + 1) {
//                    ^^^^^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:21:34: Error: Can't assign to the final variable 'i'.
//     for (final int i = 0; i < 3; i = i + 1) i, // Error
//                                  ^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:24:36: Error: Can't assign to the final variable 'i'.
//     for (final (int i) = 0; i < 3; i = i + 1) i, // Error
//                                    ^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:27:15: Error: Variable patterns in declaration context can't specify 'var' or 'final' keyword.
// Try removing the keyword.
//     for (var (final int i, String s) = (0, ''); i < 3; i = i + 1) i, // Error
//               ^^^^^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:30:22: Error: Variable patterns in declaration context can't specify 'var' or 'final' keyword.
// Try removing the keyword.
//     for (var (int i, final String s) = (0, ''); i < 3; i = i + 1) i, // Ok
//                      ^^^^^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:36:5: Error: Can't assign to the final variable 'i'.
//     i = i + 1; // Error
//     ^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:39:5: Error: Can't assign to the final variable 'i'.
//     i = i + 1; // Error
//     ^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:41:13: Error: Variable patterns in declaration context can't specify 'var' or 'final' keyword.
// Try removing the keyword.
//   for (var (final int i, String s) in [(1, 'a'), (2, 'b'), (3, 'c')]) {
//             ^^^^^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:42:5: Error: Can't assign to the final variable 'i'.
//     i = i + 1; // Error
//     ^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:44:20: Error: Variable patterns in declaration context can't specify 'var' or 'final' keyword.
// Try removing the keyword.
//   for (var (int i, final String s) in [(1, 'a'), (2, 'b'), (3, 'c')]) {
//                    ^^^^^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:48:36: Error: Can't assign to the final variable 'i'.
//     for (final int i in [1, 2, 3]) i = i + 1 // Error
//                                    ^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:51:38: Error: Can't assign to the final variable 'i'.
//     for (final (int i) in [1, 2, 3]) i = i + 1 // Error
//                                      ^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:54:15: Error: Variable patterns in declaration context can't specify 'var' or 'final' keyword.
// Try removing the keyword.
//     for (var (final int i, String s) in [(1, 'a'), (2, 'b'), (3, 'c')])
//               ^^^^^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:55:7: Error: Can't assign to the final variable 'i'.
//       i = i + 1 // Error
//       ^
//
// pkg/front_end/testcases/patterns/for_final_variable.dart:58:22: Error: Variable patterns in declaration context can't specify 'var' or 'final' keyword.
// Try removing the keyword.
//     for (var (int i, final String s) in [(1, 'a'), (2, 'b'), (3, 'c')])
//                      ^^^^^
//
import self as self;
import "dart:core" as core;

static method testFor() → dynamic {
  for (final core::int i = 0; i.{core::num::<}(3){(core::num) → core::bool}; invalid-expression "pkg/front_end/testcases/patterns/for_final_variable.dart:7:32: Error: Can't assign to the final variable 'i'.
  for (final int i = 0; i < 3; i = i + 1) {
                               ^") {
    core::print(i);
  }
  {
    final hoisted core::int i;
    {
      final synthesized core::int #0#0 = 0;
      if(!(#0#0 is core::int && (let final dynamic #t1 = i = #0#0 in true)))
        throw{for-error-handling} new core::StateError::•("Pattern matching error");
    }
    final core::int #t2 = i;
    for (final core::int i = #t2; i.{core::num::<}(3){(core::num) → core::bool}; invalid-expression "pkg/front_end/testcases/patterns/for_final_variable.dart:11:34: Error: Can't assign to the final variable 'i'.
  for (final (int i) = 0; i < 3; i = i + 1) {
                                 ^") {
      core::print(i);
    }
  }
  {
    final hoisted core::int i;
    hoisted core::String s;
    {
      final synthesized(core::int, core::String) #1#0 = (0, "");
      synthesized core::int #1#1;
      synthesized core::bool #1#1#isSet = false;
      synthesized core::String #1#2;
      synthesized core::bool #1#2#isSet = false;
      if(!((#1#1#isSet ?{core::int} #1#1{core::int} : let final dynamic #t3 = #1#1#isSet = true in #1#1 = #1#0.$1{core::int}) is core::int && (let final dynamic #t4 = i = #1#1#isSet ?{core::int} #1#1{core::int} : let final dynamic #t5 = #1#1#isSet = true in #1#1 = #1#0.$1{core::int} in true) && ((#1#2#isSet ?{core::String} #1#2{core::String} : let final dynamic #t6 = #1#2#isSet = true in #1#2 = #1#0.$2{core::String}) is core::String && (let final dynamic #t7 = s = #1#2#isSet ?{core::String} #1#2{core::String} : let final dynamic #t8 = #1#2#isSet = true in #1#2 = #1#0.$2{core::String} in true))))
        throw{for-error-handling} new core::StateError::•("Pattern matching error");
    }
    final core::int #t9 = i;
    final core::String #t10 = s;
    for (core::int i = #t9, core::String s = #t10; i.{core::num::<}(3){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      core::print(i);
    }
  }
  {
    hoisted core::int i;
    final hoisted core::String s;
    {
      final synthesized(core::int, core::String) #2#0 = (0, "");
      synthesized core::int #2#1;
      synthesized core::bool #2#1#isSet = false;
      synthesized core::String #2#2;
      synthesized core::bool #2#2#isSet = false;
      if(!((#2#1#isSet ?{core::int} #2#1{core::int} : let final dynamic #t11 = #2#1#isSet = true in #2#1 = #2#0.$1{core::int}) is core::int && (let final dynamic #t12 = i = #2#1#isSet ?{core::int} #2#1{core::int} : let final dynamic #t13 = #2#1#isSet = true in #2#1 = #2#0.$1{core::int} in true) && ((#2#2#isSet ?{core::String} #2#2{core::String} : let final dynamic #t14 = #2#2#isSet = true in #2#2 = #2#0.$2{core::String}) is core::String && (let final dynamic #t15 = s = #2#2#isSet ?{core::String} #2#2{core::String} : let final dynamic #t16 = #2#2#isSet = true in #2#2 = #2#0.$2{core::String} in true))))
        throw{for-error-handling} new core::StateError::•("Pattern matching error");
    }
    final core::int #t17 = i;
    final core::String #t18 = s;
    for (core::int i = #t17, core::String s = #t18; i.{core::num::<}(3){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
      core::print(i);
    }
  }
  core::List<core::int> l1 = block {
    final core::List<core::int> #t19 = <core::int>[];
    for (final core::int i = 0; i.{core::num::<}(3){(core::num) → core::bool}; invalid-expression "pkg/front_end/testcases/patterns/for_final_variable.dart:21:34: Error: Can't assign to the final variable 'i'.
    for (final int i = 0; i < 3; i = i + 1) i, // Error
                                 ^")
      #t19.{core::List::add}{Invariant}(i){(core::int) → void};
  } =>#t19;
  core::List<core::int> l2 = block {
    final core::List<core::int> #t20 = <core::int>[];
    final hoisted core::int i;
    {
      final synthesized core::int #3#0 = 0;
      if(!(#3#0 is core::int && (let final dynamic #t21 = i = #3#0 in true)))
        throw{for-error-handling} new core::StateError::•("Pattern matching error");
    }
    final core::int #t22 = i;
    for (final core::int i = #t22; i.{core::num::<}(3){(core::num) → core::bool}; invalid-expression "pkg/front_end/testcases/patterns/for_final_variable.dart:24:36: Error: Can't assign to the final variable 'i'.
    for (final (int i) = 0; i < 3; i = i + 1) i, // Error
                                   ^")
      #t20.{core::List::add}{Invariant}(i){(core::int) → void};
  } =>#t20;
  core::List<core::int> l3 = block {
    final core::List<core::int> #t23 = <core::int>[];
    final hoisted core::int i;
    hoisted core::String s;
    {
      final synthesized(core::int, core::String) #4#0 = (0, "");
      synthesized core::int #4#1;
      synthesized core::bool #4#1#isSet = false;
      synthesized core::String #4#2;
      synthesized core::bool #4#2#isSet = false;
      if(!((#4#1#isSet ?{core::int} #4#1{core::int} : let final dynamic #t24 = #4#1#isSet = true in #4#1 = #4#0.$1{core::int}) is core::int && (let final dynamic #t25 = i = #4#1#isSet ?{core::int} #4#1{core::int} : let final dynamic #t26 = #4#1#isSet = true in #4#1 = #4#0.$1{core::int} in true) && ((#4#2#isSet ?{core::String} #4#2{core::String} : let final dynamic #t27 = #4#2#isSet = true in #4#2 = #4#0.$2{core::String}) is core::String && (let final dynamic #t28 = s = #4#2#isSet ?{core::String} #4#2{core::String} : let final dynamic #t29 = #4#2#isSet = true in #4#2 = #4#0.$2{core::String} in true))))
        throw{for-error-handling} new core::StateError::•("Pattern matching error");
    }
    final core::int #t30 = i;
    final core::String #t31 = s;
    for (core::int i = #t30, core::String s = #t31; i.{core::num::<}(3){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
      #t23.{core::List::add}{Invariant}(i){(core::int) → void};
  } =>#t23;
  core::List<core::int> l4 = block {
    final core::List<core::int> #t32 = <core::int>[];
    hoisted core::int i;
    final hoisted core::String s;
    {
      final synthesized(core::int, core::String) #5#0 = (0, "");
      synthesized core::int #5#1;
      synthesized core::bool #5#1#isSet = false;
      synthesized core::String #5#2;
      synthesized core::bool #5#2#isSet = false;
      if(!((#5#1#isSet ?{core::int} #5#1{core::int} : let final dynamic #t33 = #5#1#isSet = true in #5#1 = #5#0.$1{core::int}) is core::int && (let final dynamic #t34 = i = #5#1#isSet ?{core::int} #5#1{core::int} : let final dynamic #t35 = #5#1#isSet = true in #5#1 = #5#0.$1{core::int} in true) && ((#5#2#isSet ?{core::String} #5#2{core::String} : let final dynamic #t36 = #5#2#isSet = true in #5#2 = #5#0.$2{core::String}) is core::String && (let final dynamic #t37 = s = #5#2#isSet ?{core::String} #5#2{core::String} : let final dynamic #t38 = #5#2#isSet = true in #5#2 = #5#0.$2{core::String} in true))))
        throw{for-error-handling} new core::StateError::•("Pattern matching error");
    }
    final core::int #t39 = i;
    final core::String #t40 = s;
    for (core::int i = #t39, core::String s = #t40; i.{core::num::<}(3){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int})
      #t32.{core::List::add}{Invariant}(i){(core::int) → void};
  } =>#t32;
}
static method testForIn() → dynamic {
  for (final core::int i in <core::int>[1, 2, 3]) {
    invalid-expression "pkg/front_end/testcases/patterns/for_final_variable.dart:36:5: Error: Can't assign to the final variable 'i'.
    i = i + 1; // Error
    ^";
  }
  for (final core::int #t41 in <core::int>[1, 2, 3]) {
    final hoisted core::int i;
    {
      final synthesized core::int #0#0 = #t41;
      if(!(#0#0 is core::int && (let final dynamic #t42 = i = #0#0 in true)))
        throw{for-error-handling} new core::StateError::•("Pattern matching error");
    }
    invalid-expression "pkg/front_end/testcases/patterns/for_final_variable.dart:39:5: Error: Can't assign to the final variable 'i'.
    i = i + 1; // Error
    ^";
  }
  for (final(core::int, core::String) #t43 in <(core::int, core::String)>[(1, "a"), (2, "b"), (3, "c")]) {
    final hoisted core::int i;
    hoisted core::String s;
    {
      final synthesized(core::int, core::String) #1#0 = #t43;
      synthesized core::int #1#1;
      synthesized core::bool #1#1#isSet = false;
      synthesized core::String #1#2;
      synthesized core::bool #1#2#isSet = false;
      if(!((#1#1#isSet ?{core::int} #1#1{core::int} : let final dynamic #t44 = #1#1#isSet = true in #1#1 = #1#0.$1{core::int}) is core::int && (let final dynamic #t45 = i = #1#1#isSet ?{core::int} #1#1{core::int} : let final dynamic #t46 = #1#1#isSet = true in #1#1 = #1#0.$1{core::int} in true) && ((#1#2#isSet ?{core::String} #1#2{core::String} : let final dynamic #t47 = #1#2#isSet = true in #1#2 = #1#0.$2{core::String}) is core::String && (let final dynamic #t48 = s = #1#2#isSet ?{core::String} #1#2{core::String} : let final dynamic #t49 = #1#2#isSet = true in #1#2 = #1#0.$2{core::String} in true))))
        throw{for-error-handling} new core::StateError::•("Pattern matching error");
    }
    invalid-expression "pkg/front_end/testcases/patterns/for_final_variable.dart:42:5: Error: Can't assign to the final variable 'i'.
    i = i + 1; // Error
    ^";
  }
  for (final(core::int, core::String) #t50 in <(core::int, core::String)>[(1, "a"), (2, "b"), (3, "c")]) {
    hoisted core::int i;
    final hoisted core::String s;
    {
      final synthesized(core::int, core::String) #2#0 = #t50;
      synthesized core::int #2#1;
      synthesized core::bool #2#1#isSet = false;
      synthesized core::String #2#2;
      synthesized core::bool #2#2#isSet = false;
      if(!((#2#1#isSet ?{core::int} #2#1{core::int} : let final dynamic #t51 = #2#1#isSet = true in #2#1 = #2#0.$1{core::int}) is core::int && (let final dynamic #t52 = i = #2#1#isSet ?{core::int} #2#1{core::int} : let final dynamic #t53 = #2#1#isSet = true in #2#1 = #2#0.$1{core::int} in true) && ((#2#2#isSet ?{core::String} #2#2{core::String} : let final dynamic #t54 = #2#2#isSet = true in #2#2 = #2#0.$2{core::String}) is core::String && (let final dynamic #t55 = s = #2#2#isSet ?{core::String} #2#2{core::String} : let final dynamic #t56 = #2#2#isSet = true in #2#2 = #2#0.$2{core::String} in true))))
        throw{for-error-handling} new core::StateError::•("Pattern matching error");
    }
    i = i.{core::num::+}(1){(core::num) → core::int};
  }
  core::List<dynamic> l1 = block {
    final core::List<dynamic> #t57 = <dynamic>[];
    for (final core::int i in <core::int>[1, 2, 3])
      #t57.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/patterns/for_final_variable.dart:48:36: Error: Can't assign to the final variable 'i'.
    for (final int i in [1, 2, 3]) i = i + 1 // Error
                                   ^"){(dynamic) → void};
  } =>#t57;
  core::List<dynamic> l2 = block {
    final core::List<dynamic> #t58 = <dynamic>[];
    for (final core::int #t59 in <core::int>[1, 2, 3]) {
      final hoisted core::int i;
      {
        final synthesized core::int #3#0 = #t59;
        if(!(#3#0 is core::int && (let final dynamic #t60 = i = #3#0 in true)))
          throw{for-error-handling} new core::StateError::•("Pattern matching error");
      }
      #t58.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/patterns/for_final_variable.dart:51:38: Error: Can't assign to the final variable 'i'.
    for (final (int i) in [1, 2, 3]) i = i + 1 // Error
                                     ^"){(dynamic) → void};
    }
  } =>#t58;
  core::List<dynamic> l3 = block {
    final core::List<dynamic> #t61 = <dynamic>[];
    for (final(core::int, core::String) #t62 in <(core::int, core::String)>[(1, "a"), (2, "b"), (3, "c")]) {
      final hoisted core::int i;
      hoisted core::String s;
      {
        final synthesized(core::int, core::String) #4#0 = #t62;
        synthesized core::int #4#1;
        synthesized core::bool #4#1#isSet = false;
        synthesized core::String #4#2;
        synthesized core::bool #4#2#isSet = false;
        if(!((#4#1#isSet ?{core::int} #4#1{core::int} : let final dynamic #t63 = #4#1#isSet = true in #4#1 = #4#0.$1{core::int}) is core::int && (let final dynamic #t64 = i = #4#1#isSet ?{core::int} #4#1{core::int} : let final dynamic #t65 = #4#1#isSet = true in #4#1 = #4#0.$1{core::int} in true) && ((#4#2#isSet ?{core::String} #4#2{core::String} : let final dynamic #t66 = #4#2#isSet = true in #4#2 = #4#0.$2{core::String}) is core::String && (let final dynamic #t67 = s = #4#2#isSet ?{core::String} #4#2{core::String} : let final dynamic #t68 = #4#2#isSet = true in #4#2 = #4#0.$2{core::String} in true))))
          throw{for-error-handling} new core::StateError::•("Pattern matching error");
      }
      #t61.{core::List::add}{Invariant}(invalid-expression "pkg/front_end/testcases/patterns/for_final_variable.dart:55:7: Error: Can't assign to the final variable 'i'.
      i = i + 1 // Error
      ^"){(dynamic) → void};
    }
  } =>#t61;
  core::List<core::int> l4 = block {
    final core::List<core::int> #t69 = <core::int>[];
    for (final(core::int, core::String) #t70 in <(core::int, core::String)>[(1, "a"), (2, "b"), (3, "c")]) {
      hoisted core::int i;
      final hoisted core::String s;
      {
        final synthesized(core::int, core::String) #5#0 = #t70;
        synthesized core::int #5#1;
        synthesized core::bool #5#1#isSet = false;
        synthesized core::String #5#2;
        synthesized core::bool #5#2#isSet = false;
        if(!((#5#1#isSet ?{core::int} #5#1{core::int} : let final dynamic #t71 = #5#1#isSet = true in #5#1 = #5#0.$1{core::int}) is core::int && (let final dynamic #t72 = i = #5#1#isSet ?{core::int} #5#1{core::int} : let final dynamic #t73 = #5#1#isSet = true in #5#1 = #5#0.$1{core::int} in true) && ((#5#2#isSet ?{core::String} #5#2{core::String} : let final dynamic #t74 = #5#2#isSet = true in #5#2 = #5#0.$2{core::String}) is core::String && (let final dynamic #t75 = s = #5#2#isSet ?{core::String} #5#2{core::String} : let final dynamic #t76 = #5#2#isSet = true in #5#2 = #5#0.$2{core::String} in true))))
          throw{for-error-handling} new core::StateError::•("Pattern matching error");
      }
      #t69.{core::List::add}{Invariant}(i = i.{core::num::+}(1){(core::num) → core::int}){(core::int) → void};
    }
  } =>#t69;
}
