From a7700f201b55c9a64bbde03489aa0eb41b87cd9c Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Mon, 18 May 2026 00:30:58 +0900 Subject: [PATCH] lib/fmt/fmttest: inline -2.5 literal in 3 f64 rows (post-#40) Pre-#40 wwstage's UNTYPED-float fold for `-2.5` was broken, so the three f64-sign tests (fprintf_f64_neg, fprintf_f64_sign_plus, asprintf_f64) used a `let nv: f64 = -2.5;` indirection to dodge it. With #40 (session-3 commit 4d6a19f) landed, the wwstage variant- widen N_UNARY-of-N_FLOATLIT fold renders the literal directly on both stages. Indirection inlined; workaround comment blocks dropped. Kept the sign-fold WHY in fprintf_f64_sign_plus (genuine semantic, not a workaround note). --- lib/fmt/fmttest.ww | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/lib/fmt/fmttest.ww b/lib/fmt/fmttest.ww index a07b5734..bb1621f5 100644 --- a/lib/fmt/fmttest.ww +++ b/lib/fmt/fmttest.ww @@ -519,24 +519,11 @@ fn closedstream(s: *io.stream) void = { match (c) { case void => {}; case io.closed => fail(); }; }; -// Negative-valued f64 rendered through fmt. PENDING task #40 (cstage -// variant-widen drops payload on N_UNARY-of-N_FLOATLIT, residual of -// #30): the literal-arg form below renders as "0" on cstage today — -// -// fmt.fprintf(&s, "{}", -2.5) // ✗ cstage: "0" -// // ✓ wwstage: "-2.5" -// -// Workaround until #40 lands: bind to a typed local so the widen -// hits the post-#30 N_IDENT path. Matches the cast form -// (`-2.5: f64`), which also works on both stages. Realistic caller -// shape (negatives usually arrive through a variable, not as a -// literal printf arg). Probe: .ai/probe_f64_unary_neg.ww. @test fn fprintf_f64_neg() void = { let mem: memio.state; let s: io.stream; memio.dynamic(&mem, &s); - let nv: f64 = -2.5; - let r: (i32 | io.closed) = fmt.fprintf(&s, "{}", nv); + let r: (i32 | io.closed) = fmt.fprintf(&s, "{}", -2.5); match (r) { case let n: i32 => { if (n != 4) { fail(); }; }; case io.closed => fail(); @@ -591,15 +578,12 @@ fn closedstream(s: *io.stream) void = { }; // Sign-mod fold: '+' on positive, '-' still wins on negative (the -// natural '-' from strconv is peeled and signof reapplies). Negative -// routed through a typed local — same task #40 workaround as -// fprintf_f64_neg above. +// natural '-' from strconv is peeled and signof reapplies). @test fn fprintf_f64_sign_plus() void = { let mem: memio.state; let s: io.stream; memio.dynamic(&mem, &s); - let nv: f64 = -1.5; - let r: (i32 | io.closed) = fmt.fprintf(&s, "{:+} {:+}", 1.5, nv); + let r: (i32 | io.closed) = fmt.fprintf(&s, "{:+} {:+}", 1.5, -1.5); match (r) { case let n: i32 => { if (n != 9) { fail(); }; }; // "+1.5 -1.5" case io.closed => fail(); @@ -677,11 +661,9 @@ fn closedstream(s: *io.stream) void = { }; }; -// Heap sink + both signs. Negative through typed local per task #40 -// workaround (see fprintf_f64_neg comment). +// Heap sink + both signs. @test fn asprintf_f64() void = { - let nv: f64 = -2.5; - let r: str = fmt.asprintf("{} {}", 1.5, nv); + let r: str = fmt.asprintf("{} {}", 1.5, -2.5); if (!streq(r, "1.5 -2.5")) { fail(); }; os.free(r.ptr: *void, r.len: u64); };