Skip to content

floating point formatting regression on windows with LLVM 14 upgrade #12063

@andrewrk

Description

@andrewrk

This test is failing on x86_64 Windows after the LLVM 14 upgrade.

zig/lib/std/fmt.zig

Lines 2286 to 2307 in 3f11d1d

test "float.decimal" {
try expectFmt("f64: 152314000000000000000000000000", "f64: {d}", .{@as(f64, 1.52314e+29)});
try expectFmt("f32: 0", "f32: {d}", .{@as(f32, 0.0)});
try expectFmt("f32: 0", "f32: {d:.0}", .{@as(f32, 0.0)});
try expectFmt("f32: 1.1", "f32: {d:.1}", .{@as(f32, 1.1234)});
try expectFmt("f32: 1234.57", "f32: {d:.2}", .{@as(f32, 1234.567)});
// -11.1234 is converted to f64 -11.12339... internally (errol3() function takes f64).
// -11.12339... is rounded back up to -11.1234
try expectFmt("f32: -11.1234", "f32: {d:.4}", .{@as(f32, -11.1234)});
try expectFmt("f32: 91.12345", "f32: {d:.5}", .{@as(f32, 91.12345)});
try expectFmt("f64: 91.1234567890", "f64: {d:.10}", .{@as(f64, 91.12345678901235)});
try expectFmt("f64: 0.00000", "f64: {d:.5}", .{@as(f64, 0.0)});
try expectFmt("f64: 6", "f64: {d:.0}", .{@as(f64, 5.700)});
try expectFmt("f64: 10.0", "f64: {d:.1}", .{@as(f64, 9.999)});
try expectFmt("f64: 1.000", "f64: {d:.3}", .{@as(f64, 1.0)});
try expectFmt("f64: 0.00030000", "f64: {d:.8}", .{@as(f64, 0.0003)});
try expectFmt("f64: 0.00000", "f64: {d:.5}", .{@as(f64, 1.40130e-45)});
try expectFmt("f64: 0.00000", "f64: {d:.5}", .{@as(f64, 9.999960e-40)});
try expectFmt("f64: 10000000000000.00", "f64: {d:.2}", .{@as(f64, 9999999999999.999)});
try expectFmt("f64: 10000000000000000000000000000000000000", "f64: {d}", .{@as(f64, 1e37)});
try expectFmt("f64: 100000000000000000000000000000000000000", "f64: {d}", .{@as(f64, 1e38)});
}

255/1523 fmt.test "std-native-Debug-bare-multi-default float.decimal"... thread 5980 panic: integer part of floating point value out of bounds
D:\a\1\s\lib\std\fmt\errol.zig:305:15: 0x7ff6c3d2d232 in mt.errol.errolInt (test.obj)
    var mid = @floatToInt(u128, val);
              ^
                                    ^
D:\a\1\s\lib\std\fmt.zig:767:27: 0x7ff6c3ff4cc2 in mt.formatFloatValue (test.obj)
        formatFloatDecimal(value, options, buf_stream.writer()) catch |err| switch (err) {
                          ^
D:\a\1\s\lib\std\fmt.zig:697:58: 0x7ff6c3fc4c2e in mt.formatValue (test.obj)
        .Float, .ComptimeFloat => return formatFloatValue(value, fmt, options, writer),
                                                         ^
D:\a\1\s\lib\std\fmt.zig:463:31: 0x7ff6c3fc4ba2 in mt.formatType (test.obj)
            return formatValue(value, actual_fmt, options, writer);
                              ^
D:\a\1\s\lib\std\fmt.zig:178:23: 0x7ff6c3f0efbd in mt.format (test.obj)
        try formatType(
                      ^
D:\a\1\s\lib\std\fmt.zig:1889:11: 0x7ff6c3e2de9a in mt.count (test.obj)
    format(counting_writer.writer(), fmt, args) catch |err| switch (err) {};
          ^
D:\a\1\s\lib\std\fmt.zig:1896:40: 0x7ff6c3e2da24 in mt.allocPrint (test.obj)
    const size = math.cast(usize, count(fmt, args)) orelse return error.OutOfMemory;
                                       ^
D:\a\1\s\lib\std\testing.zig:201:42: 0x7ff6c3d7227a in esting.expectFmt (test.obj)
    const result = try std.fmt.allocPrint(allocator, template, args);
                                         ^
D:\a\1\s\lib\std\fmt.zig:2287:18: 0x7ff6c3ba139f in mt.test "std-native-Debug-bare-multi-default float.decimal" (test.obj)
    try expectFmt("f64: 152314000000000000000000000000", "f64: {d}", .{@as(f64, 1.52314e+29)});
                 ^
D:\a\1\s\lib\test_runner.zig:79:28: 0x7ff6c3cfbd84 in root).main (test.obj)
        } else test_fn.func();
                           ^
D:\a\1\s\lib\std\start.zig:349:65: 0x7ff6c3cb7297 in tart.WinStartup (test.obj)
    std.os.windows.kernel32.ExitProcess(initEventLoopAndCallMain());
                                                                ^
Unable to dump stack trace: FileNotFound
error: the following test command failed with exit code 3:
D:\a\1\s\zig-cache\o\3f11261b1cc8172c23869e13e5cf0db2\test.exe D:\a\1\s\build\dist\bin\zig.exe
test...The following command exited with error code 1:
D:\a\1\s\build\dist\bin\zig.exe test D:\a\1\s\lib\std\std.zig --test-name-prefix std-native-Debug-bare-multi-default  --cache-dir D:\a\1\s\zig-cache --global-cache-dir C:\Users\VssAdministrator\AppData\Local\zig --name test -fno-single-threaded -I D:\a\1\s\test --zig-lib-dir D:\a\1\s\lib --enable-cache 

Next steps:

  • figure out why, is it an LLVM or zig bug?
  • if it's an LLVM bug, create a reduction with LLVM IR using llvm-reduce
  • report bug upstream

Metadata

Metadata

Assignees

No one assigned

    Labels

    arch-x86_6464-bit x86backend-llvmThe LLVM backend outputs an LLVM IR Module.bugObserved behavior contradicts documented or intended behavioros-windowsregressionIt worked in a previous version of Zig, but stopped working.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions