# 0084 — array/slice literal passed directly as a call argument miscompiles > **RESOLVED.** Root cause: `lowerArrayLiteral` always produces an aggregate > ARRAY value; the array→slice conversion is the caller's job. The local-bound > var-decl path did it (emits `array_to_slice`), but the call-argument coercion > path (`coerceCallArgs` → `coerceToType` → `CoercionResolver.classify`) had no > array→slice arm, so `classify([N]T, []T)` returned `.none` and the raw array > value was passed where a slice was expected — the callee read its {ptr,len} > header off the wrong bytes (returned 0 / garbage, segfaulted for `[]s64`). Fix: > `classify` now returns a new `.array_to_slice` plan for `[N]T → []T` (same > element type), and `coerceToType` emits the existing `array_to_slice` op, which > materializes the array into addressable storage and builds the slice header — > identical to the local-bound path. Files: `src/ir/conversions.zig`, > `src/ir/lower.zig`. Regression: `examples/0141-types-slice-literal-direct-call-arg.sx` > (string + numeric `[]s64`, direct vs local-bound). ## Symptom A `.[...]` array/slice literal passed DIRECTLY as a call argument yields a slice whose element CONTENTS are not reliably readable in the callee (silent — reads garbage, wrong results). Binding the same literal to a typed local first and passing the local is correct. ## Reproduction ```sx #import "modules/std.sx"; show :: (xs: []string) -> s64 { n:=0; i:=0; while i