cairo-lang-lowering 2.20.0-rc.0

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

//! > test_runner_name
test_function_lowering(expect_diagnostics: false)

//! > function_code
fn foo() {
    let a = (1, 2);
    let (_x, _y) = immovable(a);
    let (_x, _y) = immovable((1, 2));
}

//! > function_name
foo

//! > module_code
#[inline(never)]
fn immovable<T>(t: T) -> T {
    t
}

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters:
blk0 (root):
Statements:
  (v0: core::felt252) <- 1
  (v1: core::felt252) <- 2
  (v2: (core::felt252, core::felt252)) <- struct_construct(v0, v1)
  (v3: (core::felt252, core::felt252)) <- test::immovable::<(core::felt252, core::felt252)>(v2)
  (v4: (core::felt252, core::felt252)) <- test::immovable::<(core::felt252, core::felt252)>(v2)
End:
  Return()

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

//! > Test tuple index access - read.

//! > test_runner_name
test_function_lowering(expect_diagnostics: false)

//! > function_code
fn foo(t: (felt252, u8)) -> u8 {
    t.1
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: (core::felt252, core::integer::u8)
blk0 (root):
Statements:
  (v1: core::felt252, v2: core::integer::u8) <- struct_destructure(v0)
End:
  Return(v2)

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

//! > Test tuple index access - nested read.

//! > test_runner_name
test_function_lowering(expect_diagnostics: false)

//! > function_code
fn foo(t: (felt252, (u8, u16))) -> u16 {
    t.1.1
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: (core::felt252, (core::integer::u8, core::integer::u16))
blk0 (root):
Statements:
  (v1: core::felt252, v2: (core::integer::u8, core::integer::u16)) <- struct_destructure(v0)
  (v3: core::integer::u8, v4: core::integer::u16) <- struct_destructure(v2)
End:
  Return(v4)

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

//! > Test tuple index access - assignment to element.

//! > test_runner_name
test_function_lowering(expect_diagnostics: false)

//! > function_code
fn foo(mut t: (felt252, u8)) -> (felt252, u8) {
    t.0 = 5;
    t
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: (core::felt252, core::integer::u8)
blk0 (root):
Statements:
  (v1: core::felt252) <- 5
  (v2: core::felt252, v3: core::integer::u8) <- struct_destructure(v0)
  (v4: (core::felt252, core::integer::u8)) <- struct_construct(v1, v3)
End:
  Return(v4)

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

//! > Test tuple index access - ref argument.

//! > test_runner_name
test_function_lowering(expect_diagnostics: false)

//! > function_code
fn foo(mut t: (felt252, u8)) -> (felt252, u8) {
    bar(ref t.0);
    t
}

//! > function_name
foo

//! > module_code
fn bar(ref x: felt252) {
    x = 7;
}

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: (core::felt252, core::integer::u8)
blk0 (root):
Statements:
  (v1: core::felt252, v2: core::integer::u8) <- struct_destructure(v0)
  (v3: core::felt252) <- 7
  (v4: (core::felt252, core::integer::u8)) <- struct_construct(v3, v2)
End:
  Return(v4)

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

//! > Test tuple index access - ref tuple argument.

//! > test_runner_name
test_function_lowering(expect_diagnostics: false)

//! > function_code
fn foo(mut t: ((felt252, u8), u16)) -> ((felt252, u8), u16) {
    bar(ref t.0);
    t
}

//! > function_name
foo

//! > module_code
fn bar(ref x: (felt252, u8)) {
    x.1 = 7;
}

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: ((core::felt252, core::integer::u8), core::integer::u16)
blk0 (root):
Statements:
  (v1: (core::felt252, core::integer::u8), v2: core::integer::u16) <- struct_destructure(v0)
  (v3: core::integer::u8) <- 7
  (v4: core::felt252, v5: core::integer::u8) <- struct_destructure(v1)
  (v6: (core::felt252, core::integer::u8)) <- struct_construct(v4, v3)
  (v7: ((core::felt252, core::integer::u8), core::integer::u16)) <- struct_construct(v6, v2)
End:
  Return(v7)

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

//! > Test tuple index access - through a snapshot.

//! > test_runner_name
test_function_lowering(expect_diagnostics: false)

//! > function_code
fn foo(t: (felt252, u8)) -> @u8 {
    let s = @t;
    s.1
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: (core::felt252, core::integer::u8)
blk0 (root):
Statements:
  (v1: (core::felt252, core::integer::u8), v2: @(core::felt252, core::integer::u8)) <- snapshot(v0)
  (v3: @core::felt252, v4: @core::integer::u8) <- struct_destructure(v2)
End:
  Return(v4)

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

//! > Test tuple index access - on a snapshot tuple held in a struct member.

//! > test_runner_name
test_function_lowering(expect_diagnostics: false)

//! > function_code
fn foo(w: Wrapper) -> @u8 {
    w.inner.1
}

//! > function_name
foo

//! > module_code
#[derive(Drop, Copy)]
struct Wrapper {
    inner: @(felt252, u8),
}

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: test::Wrapper
blk0 (root):
Statements:
  (v1: @(core::felt252, core::integer::u8)) <- struct_destructure(v0)
  (v2: @core::felt252, v3: @core::integer::u8) <- struct_destructure(v1)
End:
  Return(v3)