// A `.[...]` array/slice literal passed DIRECTLY as a call argument behaves
// identically to binding it to a typed local first: the literal is
// materialized into addressable storage and a {ptr,len} slice header is built
// over it, so the callee reads the element CONTENTS correctly.
// Regression (issue 0084): a direct literal arg passed the raw array value
// where a slice was expected, so the callee read its header off the wrong
// bytes and returned garbage (0).
#import "modules/std.sx";

count_nope :: (xs: []string) -> i64 {
    n := 0;
    i := 0;
    while i < xs.len { if xs[i] == "nope" { n += 1; } i += 1; }
    return n;
}

sum :: (xs: []i64) -> i64 {
    s := 0;
    i := 0;
    while i < xs.len { s += xs[i]; i += 1; }
    return s;
}

main :: () {
    // string slice: direct literal vs local-bound — both see 2 "nope"s.
    print("str direct={}\n", count_nope(.["a", "nope", "b", "nope"]));
    local : []string = .["a", "nope", "b", "nope"];
    print("str local={}\n", count_nope(local));

    // numeric slice: direct literal vs local-bound — both sum to 100.
    print("num direct={}\n", sum(.[10, 20, 30, 40]));
    nums : []i64 = .[10, 20, 30, 40];
    print("num local={}\n", sum(nums));
}
