//! > 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::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v3: core::felt252) <- 10
  (v4: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v2, v3)
  (v5: core::felt252) <- 11
  (v6: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v4, v5)
  (v7: core::felt252) <- 12
  (v8: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v6, v7)
  (v9: core::felt252) <- 13
  (v10: core::array::Array::<core::felt252>) <- core::array::array_append::<core::felt252>(v8, v9)
  (v11: core::felt252) <- 1
  (v12: core::felt252) <- 1
  (v13: core::felt252) <- core::felt252_add(v11, v12)
  (v14: core::array::Array::<core::felt252>, v15: @core::array::Array::<core::felt252>) <- snapshot(v10)
  (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, v11, v13)
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::gas::GasBuiltin) <- core::gas::redeposit_gas(v19)
  (v30: core::panics::PanicResult::<(core::felt252,)>) <- PanicResult::Err(v22)
End:
  Return(v18, v29, v30)


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) => blk10,
  })

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

blk2:
Statements:
  (v15: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v9)
  (v16: core::option::Option::<core::box::Box::<@core::felt252>>) <- Option::Some(v13)
End:
  Goto(blk4, {v15 -> v17, v12 -> v18, v16 -> v19})

blk3:
Statements:
  (v20: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v9)
  (v21: ()) <- struct_construct()
  (v22: core::option::Option::<core::box::Box::<@core::felt252>>) <- Option::None(v21)
End:
  Goto(blk4, {v20 -> v17, v14 -> v18, v22 -> v19})

blk4:
Statements:
End:
  Match(match_enum(v19) {
    Option::Some(v23) => blk5,
    Option::None(v24) => blk6,
  })

blk5:
Statements:
  (v25: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v17)
  (v26: @core::felt252) <- core::box::unbox::<@core::felt252>(v23)
  (v27: core::option::Option::<@core::felt252>) <- Option::Some(v26)
End:
  Goto(blk7, {v25 -> v28, v27 -> v29})

blk6:
Statements:
  (v30: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v17)
  (v31: ()) <- struct_construct()
  (v32: core::option::Option::<@core::felt252>) <- Option::None(v31)
End:
  Goto(blk7, {v30 -> v28, v32 -> v29})

blk7:
Statements:
  (v33: core::array::Span::<core::felt252>) <- struct_construct(v18)
  (v34: core::array::SpanIter::<core::felt252>) <- struct_construct(v33)
End:
  Match(match_enum(v29) {
    Option::Some(v35) => blk8,
    Option::None(v36) => blk9,
  })

blk8:
Statements:
  (v37: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v28)
  (v38: core::felt252) <- core::felt252_add(v3, v4)
  (v39: core::RangeCheck, v40: core::gas::GasBuiltin, v41: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::felt252, ())>) <- test::foo[118-164](v5, v37, v34, v38, v4)
End:
  Return(v39, v40, v41)

blk9:
Statements:
  (v42: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v28)
  (v43: ()) <- struct_construct()
  (v44: (core::array::SpanIter::<core::felt252>, core::felt252, ())) <- struct_construct(v34, v3, v43)
  (v45: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::felt252, ())>) <- PanicResult::Ok(v44)
End:
  Return(v5, v42, v45)

blk10:
Statements:
  (v46: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v8)
  (v47: (core::panics::Panic, core::array::Array::<core::felt252>)) <- core::panic_with_const_felt252::<375233589013918064796019>()
  (v48: core::panics::PanicResult::<(core::array::SpanIter::<core::felt252>, core::felt252, ())>) <- PanicResult::Err(v47)
End:
  Return(v7, v46, v48)

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

//! > 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
  (v5: core::ops::range::RangeIterator::<core::integer::u32>) <- struct_construct(v3, v4)
  (v6: core::RangeCheck, v7: core::gas::GasBuiltin, v8: core::panics::PanicResult::<(core::ops::range::RangeIterator::<core::integer::u32>, ())>) <- test::MyImpl::foo[23-108](v0, v1, v5, v2)
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::ops::range::RangeIterator::<core::integer::u32>, v13: ()) <- struct_destructure(v9)
  (v14: ((),)) <- struct_construct(v13)
  (v15: core::panics::PanicResult::<((),)>) <- PanicResult::Ok(v14)
End:
  Return(v6, v11, v15)

blk2:
Statements:
  (v16: core::gas::GasBuiltin) <- core::gas::redeposit_gas(v7)
  (v17: core::panics::PanicResult::<((),)>) <- PanicResult::Err(v10)
End:
  Return(v6, v16, v17)
