//! > Test for.

//! > test_runner_name
test_generated_function

//! > function
fn foo() -> felt252 {
    let mut x = 1;
    let y = x + 1;
    let mut iter = array![10, 11, 12, 13_felt252].span();
    for _x in iter {
        x = x + y;
    }
    x
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat

//! > lowering
Main:
Parameters:
blk0 (root):
Statements:
  (v0: core::felt252) <- 1
  (v1: core::felt252) <- 1
  (v2: core::felt252) <- core::Felt252Add::add(v0, v1)
  (v3: core::array::Array::<core::felt252>) <- core::array::ArrayImpl::<core::felt252>::new()
  (v4: core::felt252) <- 10
  (v6: core::array::Array::<core::felt252>, v5: ()) <- core::array::ArrayImpl::<core::felt252>::append(v3, v4)
  (v7: core::felt252) <- 11
  (v9: core::array::Array::<core::felt252>, v8: ()) <- core::array::ArrayImpl::<core::felt252>::append(v6, v7)
  (v10: core::felt252) <- 12
  (v12: core::array::Array::<core::felt252>, v11: ()) <- core::array::ArrayImpl::<core::felt252>::append(v9, v10)
  (v13: core::felt252) <- 13
  (v15: core::array::Array::<core::felt252>, v14: ()) <- core::array::ArrayImpl::<core::felt252>::append(v12, v13)
  (v16: core::array::Array::<core::felt252>, v17: @core::array::Array::<core::felt252>) <- snapshot(v15)
  (v18: core::array::Span::<core::felt252>) <- core::array::ArrayToSpan::<core::felt252>::span(v17)
  (v19: core::array::SpanIter::<core::felt252>) <- core::array::SpanIntoIterator::<core::felt252>::into_iter(v18)
  (v21: core::array::SpanIter::<core::felt252>, v22: core::felt252, v20: ()) <- test::foo[118-164](v19, v0, v2)
End:
  Return(v22)


Final lowering:
Parameters: v0: core::RangeCheck, v1: core::gas::GasBuiltin
blk0 (root):
Statements:
  (v2: core::felt252) <- 1
  (v3: core::felt252) <- 1
  (v4: core::felt252) <- core::felt252_add(v2, v3)
  (v5: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v6: core::felt252) <- 10
  (v7: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v5, v6)
  (v8: core::felt252) <- 11
  (v9: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v7, v8)
  (v10: core::felt252) <- 12
  (v11: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v9, v10)
  (v12: core::felt252) <- 13
  (v13: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v11, v12)
  (v14: core::array::Array::<core::felt252>, v15: @core::array::Array::<core::felt252>) <- snapshot(v13)
  (v16: core::array::Span::<core::felt252>) <- struct_construct(v15)
  (v17: core::array::SpanIter::<core::felt252>) <- struct_construct(v16)
  (v18: core::RangeCheck, v19: core::gas::GasBuiltin, v20: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::felt252, ())>) <- test::foo[118-164](v0, v1, v17, v2, v4)
End:
  Match(match_enum(v20) {
    PanicResult::Ok(v21) => blk1,
    PanicResult::Err(v22) => blk2,
  })

blk1:
Statements:
  (v23: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v19)
  (v24: core::array::SpanIter::<core::felt252>, v25: core::felt252, v26: ()) <- struct_destructure(v21)
  (v27: (core::felt252,)) <- struct_construct(v25)
  (v28: core::panics::PanicResult::<(core::felt252,)>) <- PanicResult::Ok(v27)
End:
  Return(v18, v23, v28)

blk2:
Statements:
  (v29: core::panics::PanicResult::<(core::felt252,)>) <- PanicResult::Err(v22)
End:
  Return(v18, v19, v29)


Generated loop lowering for source location:
      for _x in iter {
 _____^
|         x = x + y;
|     }
|_____^

Parameters: v0: core::array::SpanIter::<core::felt252>, v1: core::felt252, v2: core::felt252
blk0 (root):
Statements:
  (v4: core::array::SpanIter::<core::felt252>, v3: core::option::Option::<@core::felt252>) <- core::array::SpanIterator::<core::felt252>::next(v0)
End:
  Match(match_enum(v3) {
    Option::Some(v5) => blk1,
    Option::None(v10) => blk2,
  })

blk1:
Statements:
  (v6: core::felt252) <- core::Felt252Add::add(v1, v2)
  (v8: core::array::SpanIter::<core::felt252>, v9: core::felt252, v7: ()) <- test::foo[118-164](v4, v6, v2)
End:
  Return(v8, v9, v7)

blk2:
Statements:
  (v11: ()) <- struct_construct()
End:
  Return(v4, v1, v11)


Final lowering:
Parameters: v0: core::RangeCheck, v1: core::gas::GasBuiltin, v2: core::array::SpanIter::<core::felt252>, v3: core::felt252, v4: core::felt252
blk0 (root):
Statements:
End:
  Match(match core::gas::withdraw_gas(v0, v1) {
    Option::Some(v5, v6) => blk1,
    Option::None(v7, v8) => blk4,
  })

blk1:
Statements:
  (v9: core::array::Span::<core::felt252>) <- struct_destructure(v2)
  (v10: @core::array::Array::<core::felt252>) <- struct_destructure(v9)
End:
  Match(match core::array::array_snapshot_pop_front::<core::felt252>(v10) {
    Option::Some(v11, v12) => blk2,
    Option::None(v13) => blk3,
  })

blk2:
Statements:
  (v14: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v6)
  (v15: core::felt252) <- core::felt252_add(v3, v4)
  (v16: core::array::Span::<core::felt252>) <- struct_construct(v11)
  (v17: core::array::SpanIter::<core::felt252>) <- struct_construct(v16)
  (v18: core::RangeCheck, v19: core::gas::GasBuiltin, v20: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::felt252, ())>) <- test::foo[118-164](v5, v14, v17, v15, v4)
End:
  Return(v18, v19, v20)

blk3:
Statements:
  (v21: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v6)
  (v22: core::array::Span::<core::felt252>) <- struct_construct(v13)
  (v23: core::array::SpanIter::<core::felt252>) <- struct_construct(v22)
  (v24: ()) <- struct_construct()
  (v25: (core::array::SpanIter::<core::felt252>, core::felt252, ())) <- struct_construct(v23, v3, v24)
  (v26: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::felt252, ())>) <- PanicResult::Ok(v25)
End:
  Return(v5, v21, v26)

blk4:
Statements:
  (v27: (core::panics::Panic, core::array::Array::<core::felt252>)) <- core::panic_with_const_felt252::<375233589013918064796019>()
  (v28: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::felt252, ())>) <- PanicResult::Err(v27)
End:
  Return(v7, v8, v28)

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

//! > Test calling function with generics Self.

//! > test_runner_name
test_generated_function

//! > function
fn foo() {
    let v = 1_u32;
    v.foo()
}

//! > function_name
foo

//! > module_code
trait MyTrait<T, +Drop<T>, +Copy<T>, +Add<T>> {
    #[inline(never)]
    fn bar(self: T) -> T {
        self
    }

    fn foo(self: T) {
        for _ in 0_u32..5 {
            Self::bar(self) + Self::bar(self);
        }
    }
}

fn bar<T, +Drop<T>, +Copy<T>, +Add<T>>(v: T) {
    let v = 1_u32;
    v.foo()
}

impl MyImpl of MyTrait<u32> {}

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat

//! > lowering
Main:
Parameters:
blk0 (root):
Statements:
  (v0: core::integer::u32) <- 1
  (v1: ()) <- test::MyImpl::foo(v0)
End:
  Return(v1)


Final lowering:
Parameters: v0: core::RangeCheck, v1: core::gas::GasBuiltin
blk0 (root):
Statements:
  (v2: core::integer::u32) <- 1
  (v3: core::integer::u32) <- 0
  (v4: core::integer::u32) <- 5
End:
  Match(match core::ops::range::internal::int_range_try_new::<core::integer::u32>(v0, v3, v4) {
    Result::Ok(v5, v6) => blk1,
    Result::Err(v7, v8) => blk2,
  })

blk1:
Statements:
  (v9: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v1)
End:
  Goto(blk3, {v5 -> v10, v9 -> v11, v6 -> v12})

blk2:
Statements:
  (v13: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v1)
End:
  Goto(blk3, {v7 -> v10, v13 -> v11, v8 -> v12})

blk3:
Statements:
  (v14: core::RangeCheck, v15: core::gas::GasBuiltin, v16: core::panics::PanicResult::<(core::ops::range::internal::IntRange::<core::integer::u32>, ())>) <- test::MyImpl::foo[23-108](v10, v11, v12, v2)
End:
  Match(match_enum(v16) {
    PanicResult::Ok(v17) => blk4,
    PanicResult::Err(v18) => blk5,
  })

blk4:
Statements:
  (v19: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v15)
  (v20: core::ops::range::internal::IntRange::<core::integer::u32>, v21: ()) <- struct_destructure(v17)
  (v22: ((),)) <- struct_construct(v21)
  (v23: core::panics::PanicResult::<((),)>) <- PanicResult::Ok(v22)
End:
  Return(v14, v19, v23)

blk5:
Statements:
  (v24: core::panics::PanicResult::<((),)>) <- PanicResult::Err(v18)
End:
  Return(v14, v15, v24)

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

//! > Test for with deref before into_iter.

//! > test_runner_name
test_generated_function

//! > function
fn foo(a: Box<Span<felt252>>) -> Array<felt252> {
    let mut arr = array![];
    for b in a {
        arr.append(*b);
    }
    return arr;
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat

//! > lowering
Main:
Parameters: v0: core::box::Box::<core::array::Span::<core::felt252>>
blk0 (root):
Statements:
  (v1: core::array::Array::<core::felt252>) <- core::array::ArrayImpl::<core::felt252>::new()
  (v2: core::array::Span::<core::felt252>) <- core::box::BoxDeref::<core::array::Span::<core::felt252>>::deref(v0)
  (v3: core::array::SpanIter::<core::felt252>) <- core::array::SpanIntoIterator::<core::felt252>::into_iter(v2)
  (v5: core::array::SpanIter::<core::felt252>, v6: core::array::Array::<core::felt252>, v4: ()) <- test::foo[78-125](v3, v1)
End:
  Return(v6)


Final lowering:
Parameters: v0: core::RangeCheck, v1: core::gas::GasBuiltin, v2: core::box::Box::<core::array::Span::<core::felt252>>
blk0 (root):
Statements:
  (v3: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v4: core::array::Span::<core::felt252>) <- core::box::unbox::<core::array::Span::<core::felt252>>(v2)
  (v5: core::array::SpanIter::<core::felt252>) <- struct_construct(v4)
  (v6: core::RangeCheck, v7: core::gas::GasBuiltin, v8: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::array::Array::<core::felt252>, ())>) <- test::foo[78-125](v0, v1, v5, v3)
End:
  Match(match_enum(v8) {
    PanicResult::Ok(v9) => blk1,
    PanicResult::Err(v10) => blk2,
  })

blk1:
Statements:
  (v11: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v7)
  (v12: core::array::SpanIter::<core::felt252>, v13: core::array::Array::<core::felt252>, v14: ()) <- struct_destructure(v9)
  (v15: (core::array::Array::<core::felt252>,)) <- struct_construct(v13)
  (v16: core::panics::PanicResult::<(core::array::Array::<core::felt252>,)>) <- PanicResult::Ok(v15)
End:
  Return(v6, v11, v16)

blk2:
Statements:
  (v17: core::panics::PanicResult::<(core::array::Array::<core::felt252>,)>) <- PanicResult::Err(v10)
End:
  Return(v6, v7, v17)


Generated loop lowering for source location:
      for b in a {
 _____^
|         arr.append(*b);
|     }
|_____^

Parameters: v0: core::array::SpanIter::<core::felt252>, v1: core::array::Array::<core::felt252>
blk0 (root):
Statements:
  (v3: core::array::SpanIter::<core::felt252>, v2: core::option::Option::<@core::felt252>) <- core::array::SpanIterator::<core::felt252>::next(v0)
End:
  Match(match_enum(v2) {
    Option::Some(v4) => blk1,
    Option::None(v11) => blk2,
  })

blk1:
Statements:
  (v5: core::felt252) <- desnap(v4)
  (v7: core::array::Array::<core::felt252>, v6: ()) <- core::array::ArrayImpl::<core::felt252>::append(v1, v5)
  (v9: core::array::SpanIter::<core::felt252>, v10: core::array::Array::<core::felt252>, v8: ()) <- test::foo[78-125](v3, v7)
End:
  Return(v9, v10, v8)

blk2:
Statements:
  (v12: ()) <- struct_construct()
End:
  Return(v3, v1, v12)


Final lowering:
Parameters: v0: core::RangeCheck, v1: core::gas::GasBuiltin, v2: core::array::SpanIter::<core::felt252>, v3: core::array::Array::<core::felt252>
blk0 (root):
Statements:
End:
  Match(match core::gas::withdraw_gas(v0, v1) {
    Option::Some(v4, v5) => blk1,
    Option::None(v6, v7) => blk4,
  })

blk1:
Statements:
  (v8: core::array::Span::<core::felt252>) <- struct_destructure(v2)
  (v9: @core::array::Array::<core::felt252>) <- struct_destructure(v8)
End:
  Match(match core::array::array_snapshot_pop_front::<core::felt252>(v9) {
    Option::Some(v10, v11) => blk2,
    Option::None(v12) => blk3,
  })

blk2:
Statements:
  (v13: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v5)
  (v14: @core::felt252) <- core::box::unbox::<@core::felt252>(v11)
  (v15: core::felt252) <- desnap(v14)
  (v16: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v3, v15)
  (v17: core::array::Span::<core::felt252>) <- struct_construct(v10)
  (v18: core::array::SpanIter::<core::felt252>) <- struct_construct(v17)
  (v19: core::RangeCheck, v20: core::gas::GasBuiltin, v21: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::array::Array::<core::felt252>, ())>) <- test::foo[78-125](v4, v13, v18, v16)
End:
  Return(v19, v20, v21)

blk3:
Statements:
  (v22: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v5)
  (v23: core::array::Span::<core::felt252>) <- struct_construct(v12)
  (v24: core::array::SpanIter::<core::felt252>) <- struct_construct(v23)
  (v25: ()) <- struct_construct()
  (v26: (core::array::SpanIter::<core::felt252>, core::array::Array::<core::felt252>, ())) <- struct_construct(v24, v3, v25)
  (v27: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::array::Array::<core::felt252>, ())>) <- PanicResult::Ok(v26)
End:
  Return(v4, v22, v27)

blk4:
Statements:
  (v28: (core::panics::Panic, core::array::Array::<core::felt252>)) <- core::panic_with_const_felt252::<375233589013918064796019>()
  (v29: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::array::Array::<core::felt252>, ())>) <- PanicResult::Err(v28)
End:
  Return(v6, v7, v29)
