From 5dae6065f4c51ac8cb3d24b24225e7c0e56c6008 Mon Sep 17 00:00:00 2001 From: hyperpolymath <6759885+hyperpolymath@users.noreply.github.com> Date: Mon, 18 May 2026 04:38:50 +0100 Subject: [PATCH] fix(stdlib): declare reassigned locals in io.affine as let mut (#128) printf/path_join/path_dirname/path_extname/read_lines reassigned loop counters and accumulators (arg_idx, i, result, parts, done) that were declared with plain let -> borrow error. Pure stdlib bug, not a compiler bug. stdlib 15->16/19; 233/233 dune test, zero regression. Refs #128 Co-Authored-By: Claude Opus 4.7 (1M context) --- stdlib/io.affine | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/stdlib/io.affine b/stdlib/io.affine index 391f06d6..6ba771ec 100644 --- a/stdlib/io.affine +++ b/stdlib/io.affine @@ -38,8 +38,8 @@ use string::{ split, join }; /// printf("Hello, {}! You are {} years old.", ["Alice", 30]) fn printf(format: String, args: [Any]) -> () { let flen = len(format); - let arg_idx = 0; - let i = 0; + let mut arg_idx = 0; + let mut i = 0; while i < flen { if i + 1 < flen && string_sub(format, i, 2) == "{}" { @@ -124,7 +124,7 @@ extern fn remove_dir(path: String) -> Result<(), String>; /// Join path components with the system separator (/) fn path_join(components: [String]) -> String { - let result = ""; + let mut result = ""; let mut first = true; for component in components { if first { @@ -143,7 +143,7 @@ fn path_join(components: [String]) -> String { /// Example: path_extension("file.txt") => Some("txt") fn path_extension(path: String) -> Option { let plen = len(path); - let i = plen - 1; + let mut i = plen - 1; while i >= 0 { let ch = string_get(path, i); if ch == '.' { @@ -170,7 +170,7 @@ fn path_filename(path: String) -> String { if plen == 0 { return ""; } - let i = plen - 1; + let mut i = plen - 1; while i >= 0 { if string_get(path, i) == '/' { return string_sub(path, i + 1, plen - i - 1); @@ -189,7 +189,7 @@ fn path_dirname(path: String) -> String { if plen == 0 { return "."; } - let i = plen - 1; + let mut i = plen - 1; while i >= 0 { if string_get(path, i) == '/' { if i == 0 { @@ -209,7 +209,7 @@ fn path_dirname(path: String) -> String { fn path_stem(path: String) -> String { let filename = path_filename(path); let flen = len(filename); - let i = flen - 1; + let mut i = flen - 1; while i > 0 { if string_get(filename, i) == '.' { return string_sub(filename, 0, i); @@ -239,8 +239,8 @@ extern fn chdir(path: String) -> Result<(), String>; /// Read all input from stdin until EOF fn read_stdin() -> Result { - let parts = []; - let done = false; + let mut parts = []; + let mut done = false; while !done { match read_line() { Ok(line) => {