library;
//
// Problems in library:
//
// pkg/front_end/testcases/patterns/assignment_in_guard.dart:7:22: Error: Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
// Try assigning to a different variable.
//     case var v when (v = 1) > 0:
//                      ^
//
// pkg/front_end/testcases/patterns/assignment_in_guard.dart:15:37: Error: Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
// Try assigning to a different variable.
//   var z = switch (42) { int v when (v = 1) >= 0 => v, _ => -1 };
//                                     ^
//
// pkg/front_end/testcases/patterns/assignment_in_guard.dart:20:27: Error: Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
// Try assigning to a different variable.
//   if (42 case var v when (v = 1) > 0) {
//                           ^
//
// pkg/front_end/testcases/patterns/assignment_in_guard.dart:26:40: Error: Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
// Try assigning to a different variable.
//   List l = [1, if (42 case int v when (v = 1) > 0) v else 1, 3];
//                                        ^
//
// pkg/front_end/testcases/patterns/assignment_in_guard.dart:33:17: Error: Pattern variables can't be assigned inside the guard of the enclosing guarded pattern.
// Try assigning to a different variable.
//         5 when (a = 4) < 1 => true,
//                 ^
//
import self as self;
import "dart:core" as core;

static method test1() → void {
  #L1:
  {
    final synthesized core::int #0#0 = 42;
    {
      hoisted core::int v;
      if((let final dynamic #t1 = v = #0#0 in true) && (v = 1).{core::num::>}(0){(core::num) → core::bool}) {
        {
          core::print(v);
          break #L1;
        }
      }
    }
    {
      {}
    }
  }
}
static method test2() → void {
  core::int z = block {
    core::int #t2;
    final synthesized core::int #0#0 = 42;
    #L2:
    {
      {
        hoisted core::int v;
        if(#0#0 is core::int && (let final dynamic #t3 = v = #0#0 in true) && (v = 1).{core::num::>=}(0){(core::num) → core::bool}) {
          #t2 = v;
          break #L2;
        }
      }
      {
        if(true) {
          #t2 = 1.{core::int::unary-}(){() → core::int};
          break #L2;
        }
      }
    }
  } =>#t2;
  core::print(z);
}
static method test3() → void {
  {
    final synthesized core::int #0#0 = 42;
    {
      hoisted core::int v;
      if((let final dynamic #t4 = v = #0#0 in true) && (v = 1).{core::num::>}(0){(core::num) → core::bool}) {
        core::print(v);
      }
    }
  }
}
static method test4() → void {
  core::List<dynamic> l = block {
    final core::List<dynamic> #t5 = <dynamic>[1];
    {
      final synthesized core::int #0#0 = 42;
      {
        hoisted core::int v;
        if(#0#0 is core::int && (let final dynamic #t6 = v = #0#0 in true) && (v = 1).{core::num::>}(0){(core::num) → core::bool})
          #t5.{core::List::add}{Invariant}(v){(dynamic) → void};
        else
          #t5.{core::List::add}{Invariant}(1){(dynamic) → void};
      }
    }
    #t5.{core::List::add}{Invariant}(3){(dynamic) → void};
  } =>#t5;
  core::print(l);
}
static method test5(dynamic o) → void {
  {
    final synthesized dynamic #1#0 = o;
    {
      hoisted dynamic a;
      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 #t7 = a = #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} in true) && ( block {
        core::bool #t8;
        final synthesized dynamic #0#0 = a;
        #L3:
        {
          {
            if(#C2 =={core::num::==}{(core::Object) → core::bool} #0#0 && (a = 4).{core::num::<}(1){(core::num) → core::bool}) {
              #t8 = true;
              break #L3;
            }
          }
          {
            if(true) {
              #t8 = false;
              break #L3;
            }
          }
        }
      } =>#t8)) {
        core::print(a);
      }
    }
  }
}

constants  {
  #C1 = 1
  #C2 = 5
}
