//! > Test arm pattern destructure for match-enum param.

//! > test_runner_name
test_function_lowering

//! > function
fn foo(e: MyEnum) {
    match e {
        MyEnum::a((_x, (_y, _z))) => {},
        MyEnum::b((_x, _y)) => {},
        MyEnum::c(_x) => {},
        MyEnum::d((_x, _y)) => {},
        MyEnum::e(_x) => {},
        MyEnum::f((_x,)) => {},
        MyEnum::g(_x) => {},
        MyEnum::h(_x) => {},
    }
}

//! > function_name
foo

//! > module_code
enum MyEnum {
    a: (felt252, (felt252, felt252)),
    b: (felt252, (felt252, felt252)),
    c: (felt252, (felt252, felt252)),
    d: (felt252, felt252),
    e: (felt252, felt252),
    f: (felt252,),
    g: (felt252,),
    h: felt252
}

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: test::MyEnum
blk0 (root):
Statements:
End:
  Match(match_enum(v0) {
    MyEnum::a(v1) => blk1,
    MyEnum::b(v6) => blk2,
    MyEnum::c(v9) => blk3,
    MyEnum::d(v10) => blk4,
    MyEnum::e(v13) => blk5,
    MyEnum::f(v14) => blk6,
    MyEnum::g(v16) => blk7,
    MyEnum::h(v17) => blk8,
  })

blk1:
Statements:
End:
  Return()

blk2:
Statements:
End:
  Return()

blk3:
Statements:
End:
  Return()

blk4:
Statements:
End:
  Return()

blk5:
Statements:
End:
  Return()

blk6:
Statements:
End:
  Return()

blk7:
Statements:
End:
  Return()

blk8:
Statements:
End:
  Return()

//! > ==========================================================================

//! > Test arm pattern destructure for match-extern.

//! > test_runner_name
test_function_lowering

//! > function
fn foo(ref a: felt252) {
    match bar(ref a) {
        MyEnum::a((_x, (_y, _z))) => {},
        MyEnum::b((_x, _y)) => {},
        MyEnum::c(_x) => {},
        MyEnum::d((_x, _y)) => {},
        MyEnum::e(_x) => {},
        MyEnum::f((_x,)) => {},
        MyEnum::g(_x) => {},
        MyEnum::h(_x) => {},
    }
}

//! > function_name
foo

//! > module_code
enum MyEnum {
  a: (felt252, (felt252, felt252)),
  b: (felt252, (felt252, felt252)),
  c: (felt252, (felt252, felt252)),
  d: (felt252, felt252),
  e: (felt252, felt252),
  f: (felt252,),
  g: (felt252,),
  h: felt252
}
extern fn bar(ref a: felt252) -> MyEnum nopanic;

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: core::felt252
blk0 (root):
Statements:
End:
  Match(match test::bar(v0) {
    MyEnum::a(v1, v2, v3) => blk1,
    MyEnum::b(v6, v7, v8) => blk2,
    MyEnum::c(v9, v10, v11) => blk3,
    MyEnum::d(v13, v14, v15) => blk4,
    MyEnum::e(v16, v17, v18) => blk5,
    MyEnum::f(v20, v21) => blk6,
    MyEnum::g(v22, v23) => blk7,
    MyEnum::h(v25, v26) => blk8,
  })

blk1:
Statements:
End:
  Return(v1)

blk2:
Statements:
End:
  Return(v6)

blk3:
Statements:
End:
  Return(v9)

blk4:
Statements:
End:
  Return(v13)

blk5:
Statements:
End:
  Return(v16)

blk6:
Statements:
End:
  Return(v20)

blk7:
Statements:
End:
  Return(v22)

blk8:
Statements:
End:
  Return(v25)

//! > ==========================================================================

//! > Test arm pattern destructure for match-enum variable.

//! > test_runner_name
test_function_lowering

//! > function
fn foo() {
    let y = bar();
    match y {
        MyEnum::a((_x, (_y, _z))) => {},
        MyEnum::b((_x, _y)) => {},
        MyEnum::c(_x) => {},
        MyEnum::d((_x, _y)) => {},
        MyEnum::e(_x) => {},
        MyEnum::f((_x,)) => {},
        MyEnum::g(_x) => {},
        MyEnum::h(_x) => {},
    }
}

//! > function_name
foo

//! > module_code
enum MyEnum {
  a: (felt252, (felt252, felt252)),
  b: (felt252, (felt252, felt252)),
  c: (felt252, (felt252, felt252)),
  d: (felt252, felt252),
  e: (felt252, felt252),
  f: (felt252,),
  g: (felt252,),
  h: felt252
}
extern fn bar() -> MyEnum nopanic;

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters:
blk0 (root):
Statements:
End:
  Match(match test::bar() {
    MyEnum::a(v0, v1) => blk1,
    MyEnum::b(v4, v5) => blk2,
    MyEnum::c(v8, v9) => blk3,
    MyEnum::d(v12, v13) => blk4,
    MyEnum::e(v16, v17) => blk5,
    MyEnum::f(v20) => blk6,
    MyEnum::g(v23) => blk7,
    MyEnum::h(v26) => blk8,
  })

blk1:
Statements:
End:
  Return()

blk2:
Statements:
End:
  Return()

blk3:
Statements:
End:
  Return()

blk4:
Statements:
End:
  Return()

blk5:
Statements:
End:
  Return()

blk6:
Statements:
End:
  Return()

blk7:
Statements:
End:
  Return()

blk8:
Statements:
End:
  Return()

//! > ==========================================================================

//! > Test arm pattern destructure for match-extern (with refs and implicits).

//! > test_runner_name
test_function_lowering

//! > function
fn foo(mut z: felt252) {
    match bar(ref z) {
      MyEnum::a((_x, (_y, _z))) => {},
      MyEnum::b((_x, _y)) => {},
      MyEnum::c(_x) => {},
      MyEnum::d((_x, _y)) => {},
      MyEnum::e(_x) => {},
      MyEnum::f((_x,)) => {},
      MyEnum::g(_x) => {},
      MyEnum::h(_x) => {},
    }
}

//! > function_name
foo

//! > module_code
enum MyEnum {
  a: (felt252, (felt252, felt252)),
  b: (felt252, (felt252, felt252)),
  c: (felt252, (felt252, felt252)),
  d: (felt252, felt252),
  e: (felt252, felt252),
  f: (felt252,),
  g: (felt252,),
  h: felt252
}
extern fn bar(ref r: felt252) -> MyEnum implicits(RangeCheck) nopanic;

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v29: core::RangeCheck, v0: core::felt252
blk0 (root):
Statements:
End:
  Match(match test::bar(v29, v0) {
    MyEnum::a(v30, v1, v2, v3) => blk1,
    MyEnum::b(v31, v6, v7, v8) => blk2,
    MyEnum::c(v32, v9, v10, v11) => blk3,
    MyEnum::d(v33, v13, v14, v15) => blk4,
    MyEnum::e(v34, v16, v17, v18) => blk5,
    MyEnum::f(v35, v20, v21) => blk6,
    MyEnum::g(v36, v22, v23) => blk7,
    MyEnum::h(v37, v25, v26) => blk8,
  })

blk1:
Statements:
End:
  Return(v30)

blk2:
Statements:
End:
  Return(v31)

blk3:
Statements:
End:
  Return(v32)

blk4:
Statements:
End:
  Return(v33)

blk5:
Statements:
End:
  Return(v34)

blk6:
Statements:
End:
  Return(v35)

blk7:
Statements:
End:
  Return(v36)

blk8:
Statements:
End:
  Return(v37)

//! > ==========================================================================

//! > Test arm pattern destructure for match-enum variable (with refs and implicits).

//! > test_runner_name
test_function_lowering

//! > function
fn foo(mut z: felt252) {
    let y = bar(ref z);
    match y {
        MyEnum::a((_x, (_y, _z))) => {},
        MyEnum::b((_x, _y)) => {},
        MyEnum::c(_x) => {},
        MyEnum::d((_x, _y)) => {},
        MyEnum::e(_x) => {},
        MyEnum::f((_x,)) => {},
        MyEnum::g(_x) => {},
        MyEnum::h(_x) => {},
    }
}

//! > function_name
foo

//! > module_code
enum MyEnum {
  a: (felt252, (felt252, felt252)),
  b: (felt252, (felt252, felt252)),
  c: (felt252, (felt252, felt252)),
  d: (felt252, felt252),
  e: (felt252, felt252),
  f: (felt252,),
  g: (felt252,),
  h: felt252
}
extern fn bar(ref r: felt252) -> MyEnum implicits(RangeCheck) nopanic;

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v77: core::RangeCheck, v0: core::felt252
blk0 (root):
Statements:
End:
  Match(match test::bar(v77, v0) {
    MyEnum::a(v78, v1, v2, v3) => blk1,
    MyEnum::b(v79, v6, v7, v8) => blk2,
    MyEnum::c(v80, v11, v12, v13) => blk3,
    MyEnum::d(v81, v16, v17, v18) => blk4,
    MyEnum::e(v82, v21, v22, v23) => blk5,
    MyEnum::f(v83, v26, v27) => blk6,
    MyEnum::g(v84, v30, v31) => blk7,
    MyEnum::h(v85, v34, v35) => blk8,
  })

blk1:
Statements:
End:
  Return(v78)

blk2:
Statements:
End:
  Return(v79)

blk3:
Statements:
End:
  Return(v80)

blk4:
Statements:
End:
  Return(v81)

blk5:
Statements:
End:
  Return(v82)

blk6:
Statements:
End:
  Return(v83)

blk7:
Statements:
End:
  Return(v84)

blk8:
Statements:
End:
  Return(v85)
