cairo-lang-lowering 2.4.1

Cairo lowering phase.
Documentation
//! > Test panic.

//! > test_runner_name
test_function_lowering

//! > function
fn foo(x: felt252) {
    bar(@x)
}

//! > function_name
foo

//! > module_code
extern fn bar(x: @felt252) nopanic;

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: core::felt252
blk0 (root):
Statements:
  (v1: core::felt252, v2: @core::felt252) <- snapshot(v0)
  () <- test::bar(v2)
  (v3: ()) <- struct_construct()
End:
  Return(v3)

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

//! > Test struct snapshot.

//! > test_runner_name
test_function_lowering

//! > function
fn foo(orig: @A) -> @A{
  bar(orig.a, orig.b);
  let A {a, b} = orig;
  bar(a, b);
  orig
}

//! > function_name
foo

//! > module_code
struct A {
    a: Array::<felt252>,
    b: felt252,
}
fn bar(a: @Array::<felt252>, b: @felt252) {
}

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: @test::A
blk0 (root):
Statements:
  (v1: @core::array::Array::<core::felt252>, v2: @core::felt252) <- struct_destructure(v0)
  (v3: @core::array::Array::<core::felt252>, v4: @core::felt252) <- struct_destructure(v0)
  (v5: ()) <- test::bar(v1, v4)
  (v6: @core::array::Array::<core::felt252>, v7: @core::felt252) <- struct_destructure(v0)
  (v8: ()) <- test::bar(v6, v7)
End:
  Return(v0)

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

//! > Test enum snapshot.

//! > test_runner_name
test_function_lowering

//! > function
fn foo(orig: @A) -> @A {
  match orig {
    A::A(a) => bar0(a),
    A::B(b) => bar1(b),
    A::C((c, d)) => bar2(c, d),
  }
  orig
}

//! > function_name
foo

//! > module_code
enum A {
    A: Array::<felt252>,
    B: felt252,
    C: (felt252, Array::<felt252>),
}
fn bar0(a: @Array::<felt252>) {
}
fn bar1(b: @felt252) {
}
fn bar2(c: @felt252, d: @Array::<felt252>) {
}

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: @test::A
blk0 (root):
Statements:
End:
  Match(match_enum(v0) {
    A::A(v1) => blk1,
    A::B(v3) => blk2,
    A::C(v5) => blk3,
  })

blk1:
Statements:
  (v2: ()) <- test::bar0(v1)
End:
  Goto(blk4, {})

blk2:
Statements:
  (v4: ()) <- test::bar1(v3)
End:
  Goto(blk4, {})

blk3:
Statements:
  (v6: @core::felt252, v7: @core::array::Array::<core::felt252>) <- struct_destructure(v5)
  (v8: ()) <- test::bar2(v6, v7)
End:
  Goto(blk4, {})

blk4:
Statements:
End:
  Return(v0)

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

//! > Test felt252 desnap.

//! > test_runner_name
test_function_lowering

//! > function
fn foo(value: @felt252) -> felt252 {
  *value
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: @core::felt252
blk0 (root):
Statements:
  (v1: core::felt252) <- desnap(v0)
End:
  Return(v1)

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

//! > Test array desnap.

//! > test_runner_name
test_function_lowering

//! > function
fn foo(value: @Array::<felt252>) -> Array::<felt252> {
  *value
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics
error: Cannot desnap a non copyable type.
 --> lib.cairo:2:3
  *value
  ^****^
note: Trait has no implementation in context: core::traits::Copy::<core::array::Array::<core::felt252>>

//! > lowering_flat
Parameters: v0: @core::array::Array::<core::felt252>

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

//! > Test member snapshot

//! > test_runner_name
test_function_lowering

//! > function
fn foo(a: A) -> usize {
  bar(@a.b);
  a.b
}

//! > function_name
foo

//! > module_code
struct A {
  b: usize,
}
extern fn bar(x: @usize) nopanic;

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: test::A
blk0 (root):
Statements:
  (v1: core::integer::u32) <- struct_destructure(v0)
  (v2: core::integer::u32, v3: @core::integer::u32) <- snapshot(v1)
  () <- test::bar(v3)
End:
  Return(v2)