//! > Test const folding simple scenario.

//! > test_runner_name
test_match_optimizer

//! > function
fn foo(a: felt252) -> felt252 {
   let b = a - 0;
   b - 0
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > before
Parameters: v0: core::felt252
blk0 (root):
Statements:
  (v1: core::felt252) <- 0
  (v5: core::felt252) <- core::felt252_sub(v0, v1)
  (v3: core::felt252) <- 0
  (v6: core::felt252) <- core::felt252_sub(v5, v3)
End:
  Return(v6)

//! > after
Parameters: v0: core::felt252
blk0 (root):
Statements:
  (v1: core::felt252) <- 0
  (v5: core::felt252) <- core::felt252_sub(v0, v1)
  (v3: core::felt252) <- 0
  (v6: core::felt252) <- core::felt252_sub(v0, v3)
End:
  Return(v0)

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

//! > Basic box const folding.

//! > test_runner_name
test_match_optimizer

//! > function
fn foo() -> Box<felt252> {
  BoxTrait::new(0)
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > before
Parameters:
blk0 (root):
Statements:
  (v0: core::felt252) <- 0
  (v2: core::box::Box::<core::felt252>) <- core::box::into_box::<core::felt252>(v0)
End:
  Return(v2)

//! > after
Parameters:
blk0 (root):
Statements:
  (v0: core::felt252) <- 0
  (v2: core::box::Box::<core::felt252>) <- 0.into_box()
End:
  Return(v2)

//! > lowering_diagnostics

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

//! > Box struct const folding.

//! > test_runner_name
test_match_optimizer

//! > function
struct A {
  a: felt252
}

fn foo() -> Box<A> {
  BoxTrait::new(A { a: 1 })
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > before
Parameters:
blk0 (root):
Statements:
  (v0: core::felt252) <- 1
  (v1: test::A) <- struct_construct(v0)
  (v3: core::box::Box::<test::A>) <- core::box::into_box::<test::A>(v1)
End:
  Return(v3)

//! > after
Parameters:
blk0 (root):
Statements:
  (v0: core::felt252) <- 1
  (v1: test::A) <- struct_construct(v0)
  (v3: core::box::Box::<test::A>) <- { 1: core::felt252 }.into_box()
End:
  Return(v3)

//! > lowering_diagnostics

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

//! > Box enum const folding.

//! > test_runner_name
test_match_optimizer

//! > function
fn foo() -> Box<Option<felt252>> {
  BoxTrait::new(Option::Some(2))
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > before
Parameters:
blk0 (root):
Statements:
  (v0: core::felt252) <- 2
  (v1: core::option::Option::<core::felt252>) <- Option::Some(v0)
  (v3: core::box::Box::<core::option::Option::<core::felt252>>) <- core::box::into_box::<core::option::Option::<core::felt252>>(v1)
End:
  Return(v3)

//! > after
Parameters:
blk0 (root):
Statements:
  (v0: core::felt252) <- 2
  (v1: core::option::Option::<core::felt252>) <- Option::Some(v0)
  (v3: core::box::Box::<core::option::Option::<core::felt252>>) <- Option::Some(2).into_box()
End:
  Return(v3)

//! > lowering_diagnostics
