//! > Test simple usage.

//! > test_runner_name
test_function_usage

//! > function
fn foo(a: usize, b: usize) {
    a;
    {
        b;
    }
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > usage
Block 2:4:
  Usage: ParamId(test::b),
  Changes:
  Snapshot_Usage:
  Introductions:
Block 0:27:
  Usage: ParamId(test::a), ParamId(test::b),
  Changes:
  Snapshot_Usage:
  Introductions:

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

//! > Test loop usage

//! > test_runner_name
test_function_usage

//! > function
fn foo(mut a: A, ref b: A) {
    let c = 5_usize;
    loop {
        let mut h = 0;
        a.b.c = c;
        if true {
            h = 1;
            let mut x = 4;
            x = 5;
            b = A { b: a.b };
            break b;
        };
    };
}

//! > function_name
foo

//! > module_code
struct A {
    b: B
}
struct B {
    c: usize,
}

//! > semantic_diagnostics

//! > usage
Block 11:16:
  Usage: LocalVarId(test::h), ParamId(test::b), ParamId(test::a)::b,
  Changes: LocalVarId(test::h), ParamId(test::b),
  Snapshot_Usage:
  Introductions: LocalVarId(test::x),
Block 8:9:
  Usage: LocalVarId(test::c), ParamId(test::a)::b, ParamId(test::b),
  Changes: ParamId(test::a)::b::c, ParamId(test::b),
  Snapshot_Usage:
  Introductions: LocalVarId(test::h),
Loop 8:4:
  Usage: LocalVarId(test::c), ParamId(test::a)::b, ParamId(test::b),
  Changes: ParamId(test::a)::b::c, ParamId(test::b),
  Snapshot_Usage:
  Introductions: LocalVarId(test::h),
Block 6:27:
  Usage: ParamId(test::b), ParamId(test::a)::b,
  Changes: ParamId(test::a)::b::c, ParamId(test::b),
  Snapshot_Usage:
  Introductions: LocalVarId(test::c),

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

//! > Test while loop usage

//! > test_runner_name
test_function_usage

//! > function
fn foo(mut a: A, ref b: A) {
    let c = 5_usize;
    let only_used_in_condition = 5;
    while only_used_in_condition != c {
        a.b.c = c;
    };
}

//! > function_name
foo

//! > module_code
struct A {
    b: B
}
struct B {
    c: usize,
}

//! > semantic_diagnostics

//! > usage
Block 9:38:
  Usage: LocalVarId(test::c), ParamId(test::a)::b::c,
  Changes: ParamId(test::a)::b::c,
  Snapshot_Usage:
  Introductions:
While 9:4:
  Usage: LocalVarId(test::c), ParamId(test::a)::b::c,
  Changes: ParamId(test::a)::b::c,
  Snapshot_Usage: LocalVarId(test::only_used_in_condition),
  Introductions:
Block 6:27:
  Usage: ParamId(test::a)::b::c,
  Changes: ParamId(test::a)::b::c,
  Snapshot_Usage:
  Introductions: LocalVarId(test::c), LocalVarId(test::only_used_in_condition),

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

//! > Test snap usage

//! > test_runner_name
test_function_usage

//! > function
fn foo(mut a: A, ref b: B) {
    let c = 5_usize;
    let only_used_in_condition = 5;
    while only_used_in_condition != c {
        {
            borrow_B(@b);
            borrow_B(@a.b);
        }
        let _ = c;
        consume_B(b);
    };
}

//! > function_name
foo

//! > module_code
struct A {
    b: B
}
struct B {
    c: usize,
}
fn consume_B(b: B) {}
fn borrow_B(b: @B) {}

//! > semantic_diagnostics

//! > usage
Block 12:8:
  Usage:
  Changes:
  Snapshot_Usage: ParamId(test::b), ParamId(test::a)::b,
  Introductions:
Block 11:38:
  Usage: LocalVarId(test::c), ParamId(test::b),
  Changes:
  Snapshot_Usage: ParamId(test::a)::b,
  Introductions:
While 11:4:
  Usage: LocalVarId(test::c), ParamId(test::b),
  Changes:
  Snapshot_Usage: LocalVarId(test::only_used_in_condition), ParamId(test::a)::b,
  Introductions:
Block 8:27:
  Usage: ParamId(test::b),
  Changes:
  Snapshot_Usage: ParamId(test::a)::b,
  Introductions: LocalVarId(test::c), LocalVarId(test::only_used_in_condition),

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

//! > Test for usage

//! > test_runner_name
test_function_usage

//! > function
fn foo(a: u32) {
    let arr = array![1, 2, 3];
    for b in arr {
        a + b;
    };
}

//! > function_name
foo

//! > module_code

//! > semantic_diagnostics

//! > usage
Block 0:0:
  Usage:
  Changes:
  Snapshot_Usage:
  Introductions: LocalVarId(test::__array_builder_macro_result__),
Block 2:17:
  Usage: ParamId(test::a), LocalVarId(test::b),
  Changes:
  Snapshot_Usage:
  Introductions:
For 2:4:
  Usage: LocalVarId(test::in), ParamId(test::a),
  Changes: LocalVarId(test::in),
  Snapshot_Usage:
  Introductions: LocalVarId(test::b),
Block 0:15:
  Usage: ParamId(test::a),
  Changes:
  Snapshot_Usage:
  Introductions: LocalVarId(test::arr), LocalVarId(test::in),
