//! > Test recursive call.

//! > test_runner_name
test_function_lowering_phases

//! > function
fn foo() {
  match Option::<felt252>::None(()) {
     Option::Some(_) => panic(ArrayTrait::new()),
     Option::None(_) => foo(),
  }
}

//! > function_name
foo

//! > module_code
use array::ArrayTrait;

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > before_all
Parameters:
blk0 (root):
Statements:
  (v0: ()) <- struct_construct()
  (v1: core::option::Option::<core::felt252>) <- Option::None(v0)
End:
  Match(match_enum(v1) {
    Option::Some(v2) => blk1,
    Option::None(v4) => blk2,
  })

blk1:
Statements:
  (v3: core::array::Array::<core::felt252>) <- core::array::ArrayImpl::<core::felt252>::new()
End:
  Panic(v3)

blk2:
Statements:
  (v5: ()) <- test::foo()
End:
  Goto(blk3, {v5 -> v6})

blk3:
Statements:
End:
  Return(v6)

//! > after_inlining
Parameters:
blk0 (root):
Statements:
  (v0: ()) <- struct_construct()
  (v1: core::option::Option::<core::felt252>) <- Option::None(v0)
End:
  Match(match_enum(v1) {
    Option::Some(v2) => blk1,
    Option::None(v4) => blk2,
  })

blk1:
Statements:
End:
  Goto(blk5, {})

blk2:
Statements:
  (v5: ()) <- test::foo()
End:
  Goto(blk3, {v5 -> v6})

blk3:
Statements:
End:
  Return(v6)

blk4:
Statements:
End:
  Panic(v3)

blk5:
Statements:
  (v7: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
End:
  Goto(blk4, {v7 -> v3})

//! > after_add_withdraw_gas
Parameters:
blk0 (root):
Statements:
  (v11: core::gas::BuiltinCosts) <- core::gas::get_builtin_costs()
End:
  Match(match core::gas::withdraw_gas_all(v11) {
    Option::Some => blk6,
    Option::None => blk7,
  })

blk1:
Statements:
End:
  Goto(blk5, {})

blk2:
Statements:
  (v5: ()) <- test::foo()
End:
  Goto(blk3, {v5 -> v6})

blk3:
Statements:
End:
  Return(v6)

blk4:
Statements:
End:
  Panic(v3)

blk5:
Statements:
  (v7: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
End:
  Goto(blk4, {v7 -> v3})

blk6:
Statements:
  (v0: ()) <- struct_construct()
  (v1: core::option::Option::<core::felt252>) <- Option::None(v0)
End:
  Match(match_enum(v1) {
    Option::Some(v2) => blk1,
    Option::None(v4) => blk2,
  })

blk7:
Statements:
  (v8: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v9: core::felt252) <- 375233589013918064796019u
  (v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
End:
  Panic(v10)

//! > after_lower_panics
Parameters:
blk0 (root):
Statements:
  (v11: core::gas::BuiltinCosts) <- core::gas::get_builtin_costs()
End:
  Match(match core::gas::withdraw_gas_all(v11) {
    Option::Some => blk6,
    Option::None => blk7,
  })

blk1:
Statements:
End:
  Goto(blk5, {})

blk2:
Statements:
  (v12: core::PanicResult::<((),)>) <- test::foo()
End:
  Match(match_enum(v12) {
    PanicResult::Ok(v13) => blk9,
    PanicResult::Err(v15) => blk10,
  })

blk3:
Statements:
  (v16: ((),)) <- struct_construct(v6)
  (v17: core::PanicResult::<((),)>) <- PanicResult::Ok(v16)
End:
  Return(v17)

blk4:
Statements:
  (v18: core::PanicResult::<((),)>) <- PanicResult::Err(v3)
End:
  Return(v18)

blk5:
Statements:
  (v7: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
End:
  Goto(blk4, {v7 -> v3})

blk6:
Statements:
  (v0: ()) <- struct_construct()
  (v1: core::option::Option::<core::felt252>) <- Option::None(v0)
End:
  Match(match_enum(v1) {
    Option::Some(v2) => blk1,
    Option::None(v4) => blk2,
  })

blk7:
Statements:
  (v8: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v9: core::felt252) <- 375233589013918064796019u
  (v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
  (v19: core::PanicResult::<((),)>) <- PanicResult::Err(v10)
End:
  Return(v19)

blk8:
Statements:
End:
  Goto(blk3, {v5 -> v6})

blk9:
Statements:
  (v14: ()) <- struct_destructure(v13)
End:
  Goto(blk8, {v14 -> v5})

blk10:
Statements:
  (v20: core::PanicResult::<((),)>) <- PanicResult::Err(v15)
End:
  Return(v20)

//! > after_add_destructs
Parameters:
blk0 (root):
Statements:
  (v11: core::gas::BuiltinCosts) <- core::gas::get_builtin_costs()
End:
  Match(match core::gas::withdraw_gas_all(v11) {
    Option::Some => blk6,
    Option::None => blk7,
  })

blk1:
Statements:
End:
  Goto(blk5, {})

blk2:
Statements:
  (v12: core::PanicResult::<((),)>) <- test::foo()
End:
  Match(match_enum(v12) {
    PanicResult::Ok(v13) => blk9,
    PanicResult::Err(v15) => blk10,
  })

blk3:
Statements:
  (v16: ((),)) <- struct_construct(v6)
  (v17: core::PanicResult::<((),)>) <- PanicResult::Ok(v16)
End:
  Return(v17)

blk4:
Statements:
  (v18: core::PanicResult::<((),)>) <- PanicResult::Err(v3)
End:
  Return(v18)

blk5:
Statements:
  (v7: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
End:
  Goto(blk4, {v7 -> v3})

blk6:
Statements:
  (v0: ()) <- struct_construct()
  (v1: core::option::Option::<core::felt252>) <- Option::None(v0)
End:
  Match(match_enum(v1) {
    Option::Some(v2) => blk1,
    Option::None(v4) => blk2,
  })

blk7:
Statements:
  (v8: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v9: core::felt252) <- 375233589013918064796019u
  (v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
  (v19: core::PanicResult::<((),)>) <- PanicResult::Err(v10)
End:
  Return(v19)

blk8:
Statements:
End:
  Goto(blk3, {v5 -> v6})

blk9:
Statements:
  (v14: ()) <- struct_destructure(v13)
End:
  Goto(blk8, {v14 -> v5})

blk10:
Statements:
  (v20: core::PanicResult::<((),)>) <- PanicResult::Err(v15)
End:
  Return(v20)

//! > after_optimize_remappings1
Parameters:
blk0 (root):
Statements:
  (v11: core::gas::BuiltinCosts) <- core::gas::get_builtin_costs()
End:
  Match(match core::gas::withdraw_gas_all(v11) {
    Option::Some => blk6,
    Option::None => blk7,
  })

blk1:
Statements:
End:
  Goto(blk5, {})

blk2:
Statements:
  (v12: core::PanicResult::<((),)>) <- test::foo()
End:
  Match(match_enum(v12) {
    PanicResult::Ok(v13) => blk9,
    PanicResult::Err(v15) => blk10,
  })

blk3:
Statements:
  (v16: ((),)) <- struct_construct(v14)
  (v17: core::PanicResult::<((),)>) <- PanicResult::Ok(v16)
End:
  Return(v17)

blk4:
Statements:
  (v18: core::PanicResult::<((),)>) <- PanicResult::Err(v7)
End:
  Return(v18)

blk5:
Statements:
  (v7: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
End:
  Goto(blk4, {})

blk6:
Statements:
  (v0: ()) <- struct_construct()
  (v1: core::option::Option::<core::felt252>) <- Option::None(v0)
End:
  Match(match_enum(v1) {
    Option::Some(v2) => blk1,
    Option::None(v4) => blk2,
  })

blk7:
Statements:
  (v8: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v9: core::felt252) <- 375233589013918064796019u
  (v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
  (v19: core::PanicResult::<((),)>) <- PanicResult::Err(v10)
End:
  Return(v19)

blk8:
Statements:
End:
  Goto(blk3, {})

blk9:
Statements:
  (v14: ()) <- struct_destructure(v13)
End:
  Goto(blk8, {})

blk10:
Statements:
  (v20: core::PanicResult::<((),)>) <- PanicResult::Err(v15)
End:
  Return(v20)

//! > after_delay_var_def1
Parameters:
blk0 (root):
Statements:
  (v11: core::gas::BuiltinCosts) <- core::gas::get_builtin_costs()
End:
  Match(match core::gas::withdraw_gas_all(v11) {
    Option::Some => blk6,
    Option::None => blk7,
  })

blk1:
Statements:
End:
  Goto(blk5, {})

blk2:
Statements:
  (v12: core::PanicResult::<((),)>) <- test::foo()
End:
  Match(match_enum(v12) {
    PanicResult::Ok(v13) => blk9,
    PanicResult::Err(v15) => blk10,
  })

blk3:
Statements:
  (v16: ((),)) <- struct_construct(v14)
  (v17: core::PanicResult::<((),)>) <- PanicResult::Ok(v16)
End:
  Return(v17)

blk4:
Statements:
  (v18: core::PanicResult::<((),)>) <- PanicResult::Err(v7)
End:
  Return(v18)

blk5:
Statements:
  (v7: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
End:
  Goto(blk4, {})

blk6:
Statements:
  (v0: ()) <- struct_construct()
  (v1: core::option::Option::<core::felt252>) <- Option::None(v0)
End:
  Match(match_enum(v1) {
    Option::Some(v2) => blk1,
    Option::None(v4) => blk2,
  })

blk7:
Statements:
  (v8: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v9: core::felt252) <- 375233589013918064796019u
  (v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
  (v19: core::PanicResult::<((),)>) <- PanicResult::Err(v10)
End:
  Return(v19)

blk8:
Statements:
End:
  Goto(blk3, {})

blk9:
Statements:
  (v14: ()) <- struct_destructure(v13)
End:
  Goto(blk8, {})

blk10:
Statements:
  (v20: core::PanicResult::<((),)>) <- PanicResult::Err(v15)
End:
  Return(v20)

//! > after_optimize_matches
Parameters:
blk0 (root):
Statements:
  (v11: core::gas::BuiltinCosts) <- core::gas::get_builtin_costs()
End:
  Match(match core::gas::withdraw_gas_all(v11) {
    Option::Some => blk6,
    Option::None => blk7,
  })

blk1:
Statements:
End:
  Goto(blk5, {})

blk2:
Statements:
  (v12: core::PanicResult::<((),)>) <- test::foo()
End:
  Match(match_enum(v12) {
    PanicResult::Ok(v13) => blk9,
    PanicResult::Err(v15) => blk10,
  })

blk3:
Statements:
  (v16: ((),)) <- struct_construct(v14)
  (v17: core::PanicResult::<((),)>) <- PanicResult::Ok(v16)
End:
  Return(v17)

blk4:
Statements:
  (v18: core::PanicResult::<((),)>) <- PanicResult::Err(v7)
End:
  Return(v18)

blk5:
Statements:
  (v7: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
End:
  Goto(blk4, {})

blk6:
Statements:
  (v0: ()) <- struct_construct()
End:
  Goto(blk2, {})

blk7:
Statements:
  (v8: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v9: core::felt252) <- 375233589013918064796019u
  (v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
  (v19: core::PanicResult::<((),)>) <- PanicResult::Err(v10)
End:
  Return(v19)

blk8:
Statements:
End:
  Goto(blk3, {})

blk9:
Statements:
  (v14: ()) <- struct_destructure(v13)
End:
  Goto(blk8, {})

blk10:
Statements:
  (v20: core::PanicResult::<((),)>) <- PanicResult::Err(v15)
End:
  Return(v20)

//! > after_lower_implicits
Parameters: v21: core::RangeCheck, v22: core::gas::GasBuiltin
blk0 (root):
Statements:
  (v11: core::gas::BuiltinCosts) <- core::gas::get_builtin_costs()
End:
  Match(match core::gas::withdraw_gas_all(v21, v22, v11) {
    Option::Some(v23, v24) => blk6,
    Option::None(v25, v26) => blk7,
  })

blk1:
Statements:
End:
  Goto(blk5, {})

blk2:
Statements:
  (v29: core::RangeCheck, v30: core::gas::GasBuiltin, v12: core::PanicResult::<((),)>) <- test::foo(v27, v28)
End:
  Match(match_enum(v12) {
    PanicResult::Ok(v13) => blk9,
    PanicResult::Err(v15) => blk10,
  })

blk3:
Statements:
  (v16: ((),)) <- struct_construct(v14)
  (v17: core::PanicResult::<((),)>) <- PanicResult::Ok(v16)
End:
  Return(v33, v34, v17)

blk4:
Statements:
  (v18: core::PanicResult::<((),)>) <- PanicResult::Err(v7)
End:
  Return(v18)

blk5:
Statements:
  (v7: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
End:
  Goto(blk4, {})

blk6:
Statements:
  (v0: ()) <- struct_construct()
End:
  Goto(blk2, {v23 -> v27, v24 -> v28})

blk7:
Statements:
  (v8: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v9: core::felt252) <- 375233589013918064796019u
  (v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
  (v19: core::PanicResult::<((),)>) <- PanicResult::Err(v10)
End:
  Return(v25, v26, v19)

blk8:
Statements:
End:
  Goto(blk3, {v31 -> v33, v32 -> v34})

blk9:
Statements:
  (v14: ()) <- struct_destructure(v13)
End:
  Goto(blk8, {v29 -> v31, v30 -> v32})

blk10:
Statements:
  (v20: core::PanicResult::<((),)>) <- PanicResult::Err(v15)
End:
  Return(v29, v30, v20)

//! > after_optimize_remappings2
Parameters: v21: core::RangeCheck, v22: core::gas::GasBuiltin
blk0 (root):
Statements:
  (v11: core::gas::BuiltinCosts) <- core::gas::get_builtin_costs()
End:
  Match(match core::gas::withdraw_gas_all(v21, v22, v11) {
    Option::Some(v23, v24) => blk6,
    Option::None(v25, v26) => blk7,
  })

blk1:
Statements:
End:
  Goto(blk5, {})

blk2:
Statements:
  (v29: core::RangeCheck, v30: core::gas::GasBuiltin, v12: core::PanicResult::<((),)>) <- test::foo(v23, v24)
End:
  Match(match_enum(v12) {
    PanicResult::Ok(v13) => blk9,
    PanicResult::Err(v15) => blk10,
  })

blk3:
Statements:
  (v16: ((),)) <- struct_construct(v14)
  (v17: core::PanicResult::<((),)>) <- PanicResult::Ok(v16)
End:
  Return(v29, v30, v17)

blk4:
Statements:
  (v18: core::PanicResult::<((),)>) <- PanicResult::Err(v7)
End:
  Return(v18)

blk5:
Statements:
  (v7: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
End:
  Goto(blk4, {})

blk6:
Statements:
  (v0: ()) <- struct_construct()
End:
  Goto(blk2, {})

blk7:
Statements:
  (v8: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v9: core::felt252) <- 375233589013918064796019u
  (v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
  (v19: core::PanicResult::<((),)>) <- PanicResult::Err(v10)
End:
  Return(v25, v26, v19)

blk8:
Statements:
End:
  Goto(blk3, {})

blk9:
Statements:
  (v14: ()) <- struct_destructure(v13)
End:
  Goto(blk8, {})

blk10:
Statements:
  (v20: core::PanicResult::<((),)>) <- PanicResult::Err(v15)
End:
  Return(v29, v30, v20)

//! > after_delay_var_def2
Parameters: v21: core::RangeCheck, v22: core::gas::GasBuiltin
blk0 (root):
Statements:
  (v11: core::gas::BuiltinCosts) <- core::gas::get_builtin_costs()
End:
  Match(match core::gas::withdraw_gas_all(v21, v22, v11) {
    Option::Some(v23, v24) => blk6,
    Option::None(v25, v26) => blk7,
  })

blk1:
Statements:
End:
  Goto(blk5, {})

blk2:
Statements:
  (v29: core::RangeCheck, v30: core::gas::GasBuiltin, v12: core::PanicResult::<((),)>) <- test::foo(v23, v24)
End:
  Match(match_enum(v12) {
    PanicResult::Ok(v13) => blk9,
    PanicResult::Err(v15) => blk10,
  })

blk3:
Statements:
  (v16: ((),)) <- struct_construct(v14)
  (v17: core::PanicResult::<((),)>) <- PanicResult::Ok(v16)
End:
  Return(v29, v30, v17)

blk4:
Statements:
  (v18: core::PanicResult::<((),)>) <- PanicResult::Err(v7)
End:
  Return(v18)

blk5:
Statements:
  (v7: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
End:
  Goto(blk4, {})

blk6:
Statements:
End:
  Goto(blk2, {})

blk7:
Statements:
  (v8: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v9: core::felt252) <- 375233589013918064796019u
  (v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
  (v19: core::PanicResult::<((),)>) <- PanicResult::Err(v10)
End:
  Return(v25, v26, v19)

blk8:
Statements:
End:
  Goto(blk3, {})

blk9:
Statements:
  (v14: ()) <- struct_destructure(v13)
End:
  Goto(blk8, {})

blk10:
Statements:
  (v20: core::PanicResult::<((),)>) <- PanicResult::Err(v15)
End:
  Return(v29, v30, v20)

//! > after_reorganize_blocks (final)
Parameters: v21: core::RangeCheck, v22: core::gas::GasBuiltin
blk0 (root):
Statements:
  (v11: core::gas::BuiltinCosts) <- core::gas::get_builtin_costs()
End:
  Match(match core::gas::withdraw_gas_all(v21, v22, v11) {
    Option::Some(v23, v24) => blk1,
    Option::None(v25, v26) => blk4,
  })

blk1:
Statements:
  (v29: core::RangeCheck, v30: core::gas::GasBuiltin, v12: core::PanicResult::<((),)>) <- test::foo(v23, v24)
End:
  Match(match_enum(v12) {
    PanicResult::Ok(v13) => blk2,
    PanicResult::Err(v15) => blk3,
  })

blk2:
Statements:
  (v14: ()) <- struct_destructure(v13)
  (v16: ((),)) <- struct_construct(v14)
  (v17: core::PanicResult::<((),)>) <- PanicResult::Ok(v16)
End:
  Return(v29, v30, v17)

blk3:
Statements:
  (v20: core::PanicResult::<((),)>) <- PanicResult::Err(v15)
End:
  Return(v29, v30, v20)

blk4:
Statements:
  (v8: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v9: core::felt252) <- 375233589013918064796019u
  (v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
  (v19: core::PanicResult::<((),)>) <- PanicResult::Err(v10)
End:
  Return(v25, v26, v19)
