//! > Test function call.

//! > test_runner_name
test_function_lowering

//! > function
fn foo(ref a: felt252) -> felt252 {
    let b = true;
    if true {
      bar(ref a, b);
    } else {
    }
    if false {
      return 6;
    } else {
    }
    5
}

//! > function_name
foo

//! > module_code
fn bar(ref a: felt252, b: bool) {
}

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: core::felt252
blk0 (root):
Statements:
  (v1: ()) <- struct_construct()
  (v2: core::bool) <- bool::True(v1)
  (v7: core::felt252, v6: ()) <- test::bar(v0, v2)
  (v15: core::felt252) <- 5u
End:
  Return(v7, v15)

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

//! > Test method call.

//! > test_runner_name
test_function_lowering

//! > function
fn foo() -> Option::<felt252> {
  let x = Option::None(());
  x.is_some();
  x
}

//! > function_name
foo

//! > module_code
// TODO(spapini): Make this generic too.
trait OptionTrait<T>{
  fn is_some(self: Option::<T>) -> bool;
}
impl OptionTraitImpl<T, impl TDrop: Drop::<T>> of OptionTrait::<T> {
  fn is_some(self: Option::<T>) -> bool {
      match self {
          Option::Some(_) => true,
          Option::None => false,
      }
  }
}

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters:
blk0 (root):
Statements:
  (v0: ()) <- struct_construct()
  (v1: core::option::Option::<core::felt252>) <- Option::None(v0)
  (v2: core::bool) <- test::OptionTraitImpl::<core::felt252, core::felt252Drop>::is_some(v1)
End:
  Return(v1)
