// Build: build/flecha build examples/checked_slices.fl -o build/checked_slices
void increment([]i32 values) {
loop usize i = 0; i < values.len(); i++ {
i32 sum([]const i32 values) {
for (_, value) := range values {
[5]i32 values = [10, 20, 30, 40, 50];
middle := values[1:4]; // Borrows elements 1, 2, and 3; no allocation.
increment(middle); // Reborrows for the call; middle remains usable.
[]const i32 readonly = middle[:];
copy := readonly; // Read-only handles can be copied.
if sum(copy) != 95 { return 1; }
for (index, value) := range readonly {
// All shared uses ended; mutation through middle is available again.
moved := middle; // Mutable handles move; middle is no longer usable.
if empty.len() != 0 { return 2; }
// The last slice use ended; direct array access is available again.
if values[1] != 22 or values[2] != 32 or values[3] != 42 { return 3; }