//! > Call with coupon

//! > test_runner_name
test_function_lowering

//! > function
fn foo(x: bar::Coupon) {
    bar(__coupon__: x);
}

fn bar() nopanic {
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: test::bar::Coupon
blk0 (root):
Statements:
End:
  Return()

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

//! > Coupon moved

//! > test_runner_name
test_function_lowering

//! > function
fn foo(x: bar::Coupon) -> bar::Coupon {
    bar(__coupon__: x);
    x // Variable was previously moved.
}

fn bar() nopanic {
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics
error: Variable was previously moved.
 --> lib.cairo:3:5
    x // Variable was previously moved.
    ^
note: variable was previously used here:
  --> lib.cairo:2:21
    bar(__coupon__: x);
                    ^
note: Trait has no implementation in context: core::traits::Copy::<test::bar::Coupon>

//! > lowering_flat
Parameters: v0: test::bar::Coupon

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

//! > Calling panicable function with coupon

//! > test_runner_name
test_function_lowering

//! > function
fn foo(x: bar::Coupon) {
    bar(__coupon__: x);
}

fn bar() {
    panic(array![])
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: test::bar::Coupon
blk0 (root):
Statements:
  (v10: core::array::Array::<core::felt252>) <- core::array::array_new::<core::felt252>()
  (v11: core::panics::Panic) <- struct_construct()
  (v12: (core::panics::Panic, core::array::Array::<core::felt252>)) <- struct_construct(v11, v10)
  (v13: core::panics::PanicResult::<((),)>) <- PanicResult::Err(v12)
End:
  Return(v13)

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

//! > Inlining disabled when coupon is used.

//! > test_runner_name
test_function_lowering

//! > function
fn foo(x: bar::Coupon) {
    bar(__coupon__: x);
}

#[inline(always)]
fn bar() {}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > lowering_diagnostics

//! > lowering_flat
Parameters: v0: test::bar::Coupon
blk0 (root):
Statements:
End:
  Return()
