//! > Test closure with Destruct.

//! > test_runner_name
test_generated_function

//! > function
fn foo(mut a: Felt252Dict<felt252>,) {
    |b: felt252| {
        let _ = a.insert(b, b);
    };
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics
error: Unsupported feature.
 --> lib.cairo:2:5
    |b: felt252| {
    ^************^

//! > lowering
Main:
Parameters: v0: core::dict::Felt252Dict::<core::felt252>
blk0 (root):
Statements:
  (v1: {closure@lib.cairo:2:5: 2:17}) <- struct_construct(v0)
  (v2: ()) <- struct_construct()
End:
  Return(v2)


Final lowering:
Parameters: v0: core::dict::Felt252Dict::<core::felt252>
blk0 (root):
Statements:
  (v1: {closure@lib.cairo:2:5: 2:17}) <- struct_construct(v0)
  (v2: ()) <- Generated core::traits::Destruct::<{closure@lib.cairo:2:5: 2:17}>::destruct(v1)
End:
  Return()


Generated Destruct::destruct lowering for source location:
    |b: felt252| {
    ^************^

Parameters: v0: {closure@lib.cairo:2:5: 2:17}
blk0 (root):
Statements:
  (v1: core::dict::Felt252Dict::<core::felt252>) <- struct_destructure(v0)
  (v2: ()) <- struct_construct()
End:
  Return(v2)


Final lowering:
Parameters: v0: core::RangeCheck, v1: core::SegmentArena, v2: core::gas::GasBuiltin, v3: {closure@lib.cairo:2:5: 2:17}
blk0 (root):
Statements:
  (v4: core::dict::Felt252Dict::<core::felt252>) <- struct_destructure(v3)
  (v5: core::RangeCheck, v6: core::SegmentArena, v7: core::gas::GasBuiltin, v8: core::dict::SquashedFelt252Dict::<core::felt252>) <- core::dict::Felt252DictImpl::<core::felt252, core::Felt252Felt252DictValue>::squash(v0, v1, v2, v4)
End:
  Return(v5, v6, v7)

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

//! > Test closure with PanicDestruct.

//! > test_runner_name
test_generated_function

//! > function
fn foo(mut a: PanicDestructable) {
    || {
        let PanicDestructable { } = a;
    };
    panic!("Panic");
}

//! > function_name
foo

//! > module_code
struct PanicDestructable {}

impl MyPanicDesruct of PanicDestruct<PanicDestructable> {
    // Disable inlining to see the panic_destruct call in the lowering output.
    #[inline(never)]
    fn panic_destruct(self: PanicDestructable, ref panic: Panic) nopanic {
        let PanicDestructable { } = self;
    }
}

//! > semantic_diagnostics

//! > lowering_diagnostics
error: Unsupported feature.
 --> lib.cairo:11:5
    || {
    ^**^

//! > lowering
Main:
Parameters: v0: test::PanicDestructable
blk0 (root):
Statements:
  (v1: {closure@lib.cairo:11:5: 11:7}) <- struct_construct(v0)
  (v2: core::array::Array::<core::felt252>) <- core::array::ArrayImpl::<core::felt252>::new()
  (v3: core::felt252) <- 1997209042069643135709344952807065910992472029923670688473712229447419591075
  (v5: core::array::Array::<core::felt252>, v4: ()) <- core::array::ArrayImpl::<core::felt252>::append(v2, v3)
  (v6: core::felt252) <- 0
  (v8: core::array::Array::<core::felt252>, v7: ()) <- core::array::ArrayImpl::<core::felt252>::append(v5, v6)
  (v9: core::felt252) <- 345232009571
  (v11: core::array::Array::<core::felt252>, v10: ()) <- core::array::ArrayImpl::<core::felt252>::append(v8, v9)
  (v12: core::felt252) <- 5
  (v14: core::array::Array::<core::felt252>, v13: ()) <- core::array::ArrayImpl::<core::felt252>::append(v11, v12)
  (v15: core::panics::Panic) <- struct_construct()
  (v16: (core::panics::Panic, core::array::Array::<core::felt252>)) <- struct_construct(v15, v14)
End:
  Panic(v16)


Final lowering:
Parameters: v0: test::PanicDestructable
blk0 (root):
Statements:
  (v1: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v2: core::felt252) <- 1997209042069643135709344952807065910992472029923670688473712229447419591075
  (v3: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v1, v2)
  (v4: core::felt252) <- 0
  (v5: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v3, v4)
  (v6: core::felt252) <- 345232009571
  (v7: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v5, v6)
  (v8: core::felt252) <- 5
  (v9: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v7, v8)
  (v10: {closure@lib.cairo:11:5: 11:7}) <- struct_construct(v0)
  (v11: core::panics::Panic) <- struct_construct()
  (v12: core::panics::Panic, v13: ()) <- Generated core::traits::PanicDestruct::<{closure@lib.cairo:11:5: 11:7}>::panic_destruct(v10, v11)
  (v14: (core::panics::Panic, core::array::Array::<core::felt252>)) <- struct_construct(v12, v9)
  (v15: core::panics::PanicResult::<((),)>) <- PanicResult::Err(v14)
End:
  Return(v15)


Generated PanicDestruct::panic_destruct lowering for source location:
    || {
    ^**^

Parameters: v0: {closure@lib.cairo:11:5: 11:7}, v1: core::panics::Panic
blk0 (root):
Statements:
  (v2: test::PanicDestructable) <- struct_destructure(v0)
  (v3: ()) <- struct_construct()
End:
  Return(v1, v3)


Final lowering:
Parameters: v0: {closure@lib.cairo:11:5: 11:7}, v1: core::panics::Panic
blk0 (root):
Statements:
  (v2: test::PanicDestructable) <- struct_destructure(v0)
  (v3: core::panics::Panic) <- test::MyPanicDesruct::panic_destruct(v2, v1)
End:
  Return(v3)
