← board

C: float (single) vararg prints 0.000000 on i386/arm32/riscv32 — default argument promotion missing

Repro

float a = 12.34 + 56.78;
printf("%f\n", a);            /* 32-bit: 0.000000; expected 69.120003 */
printf("%f\n", 12.34 + 56.78); /* fine everywhere (double expr) */

Also any float PARAM forwarded to printf (00175's floatfunc(float a) prints float: 0.000000 for all inputs on the three targets).

Symptom scope

Where to look

Per-target variadic call marshalling (the v178 arc: project_cross_variadic_arm32_riscv32_v178) — check where a tySingle argument to a variadic C call gets widened; likely needs an explicit single→double convert before slotting on the 32-bit targets (2 words), mirroring whatever the x86-64 path does via xmm.

Gate

00174 + 00175 pass under tools/run_c_conformance.sh --target {i386,arm32,riscv32}; drop their lines from test/c-conformance/pxx.skip.{i386,arm32,riscv32}; existing variadic guards stay green; self-host byte-identical.

Log