Bug 20848 – Bug in formatValueImpl

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P1
Component
phobos
Product
D
Version
D2
Platform
x86_64
OS
Linux
Creation time
2020-05-19T19:12:46Z
Last change time
2021-01-28T10:21:56Z
Keywords
pull
Assigned to
No Owner
Creator
Victor Porton

Comments

Comment #0 by porton — 2020-05-19T19:12:46Z
Apaprently I found a bug in `Nullable`: https://github.com/vporton/nullable-mofile-bug /////////////////// import std.typecons; import mofile; Nullable!MoFile mo; /////////////////// /snap/dmd/102/bin/../import/phobos/std/format.d(3217,9): Error: static assert: "immutable(void)[] must be an InputRange" /snap/dmd/102/bin/../import/phobos/std/format.d(1875,20): instantiated from here: formatValueImpl!(Appender!string, immutable(void)[], char) /snap/dmd/102/bin/../import/phobos/std/format.d(3749,16): instantiated from here: formatValue!(Appender!string, immutable(void)[], char) /snap/dmd/102/bin/../import/phobos/std/format.d(4451,30): instantiated from here: formatElement!(Appender!string, immutable(void)[], char) /snap/dmd/102/bin/../import/phobos/std/format.d(1875,20): ... (2 instantiations, -v to show) ... /snap/dmd/102/bin/../import/phobos/std/typecons.d(2791,17): instantiated from here: toString!(Appender!string) source/test.d(4,1): instantiated from here: Nullable!(MoFile) dmd failed with exit code 1. $ dmd --version DMD64 D Compiler v2.090.1 Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved written by Walter Bright
Comment #1 by porton — 2020-05-20T06:22:51Z
A simpler test case: /////////////////////////////// import std.typecons; struct MoFile { immutable(void)[] data; } Nullable!MoFile mo; /////////////////////////////// $ dmd test.d /snap/dmd/102/bin/../import/phobos/std/format.d(3217): Error: static assert: "immutable(void)[] must be an InputRange" /snap/dmd/102/bin/../import/phobos/std/format.d(1875): instantiated from here: formatValueImpl!(Appender!string, immutable(void)[], char) /snap/dmd/102/bin/../import/phobos/std/format.d(3749): instantiated from here: formatValue!(Appender!string, immutable(void)[], char) /snap/dmd/102/bin/../import/phobos/std/format.d(4451): instantiated from here: formatElement!(Appender!string, immutable(void)[], char) /snap/dmd/102/bin/../import/phobos/std/format.d(1875): ... (2 instantiations, -v to show) ... /snap/dmd/102/bin/../import/phobos/std/typecons.d(2791): instantiated from here: toString!(Appender!string) test.d(7): instantiated from here: Nullable!(MoFile)
Comment #2 by porton — 2020-05-20T06:42:22Z
The error is here (format.d from phobos): private void formatValueImpl(Writer, T, Char)(auto ref Writer w, T obj, scope const ref FormatSpec!Char f) if (is(DynamicArrayTypeOf!T) && !is(StringTypeOf!T) && !is(T == enum) && !hasToString!(T, Char)) { static if (is(const(ArrayTypeOf!T) == const(void[]))) { formatValueImpl(w, cast(const ubyte[]) obj, f); } else static if (!isInputRange!T) { alias U = Unqual!(ArrayTypeOf!T); static assert(isInputRange!U, U.stringof ~ " must be an InputRange"); U val = obj; formatValueImpl(w, val, f); } else { formatRange(w, obj, f); } } In the above code the type immutable(void)[] is forgotten to be considered. Somebody, please fix it.
Comment #3 by dlang-bot — 2020-07-13T21:47:57Z
@quickfur created dlang/phobos pull request #7556 "Fix issue 20848: format should work with immutable(void)[]" fixing this issue: - Fix issue 20848: format should work with immutable(void)[] The bug is that if `T == immutable(void)[]`, then `const(T)` does not collapse to `const(void[])`, but is actually `const(immutable(void)[])`. So a strict type equality check will fail. However, `const(T)` *is* implicitly convertible to `const(void[])`, which serves our purpose just as well. So just use that check instead. https://github.com/dlang/phobos/pull/7556
Comment #4 by dlang-bot — 2021-01-28T10:21:56Z
dlang/phobos pull request #7556 "Fix issue 20848: format should work with immutable(void)[]" was merged into master: - 7cc61dda2ce197c44fbb6d505f31d81e654f5054 by H. S. Teoh: Fix issue 20848: format should work with immutable(void)[] The bug is that if `T == immutable(void)[]`, then `const(T)` does not collapse to `const(void[])`, but is actually `const(immutable(void)[])`. So a strict type equality check will fail. However, `const(T)` *is* implicitly convertible to `const(void[])`, which serves our purpose just as well. So just use that check instead. https://github.com/dlang/phobos/pull/7556