www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 22873] New: Wrong std.format output for `inout`


          Issue ID: 22873
           Summary: Wrong std.format output for `inout`
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: major
          Priority: P1
         Component: phobos
          Assignee: nobody puremagic.com
          Reporter: johanengelen weka.io

For us, this is a regression since dlang2.099, but the testcase shows the
bigger problem that has apparently always existed.

import std.stdio;
import std.format;

struct U8  {  string toString() const { return "blah"; } }

struct ContainsU8 {
    U8 text;
    auto makeInout() inout // with/without `inout` gives different output

void foo(T)(T obj)
    pragma(msg, T);
    writeln(format("%s", obj));

void main() {
    ContainsU8 a;

This prints "inout(U8)()". If you remove `inout` from line 8, the program
outputs "blah", as it should.

The problem is that `std.format.internal.write.hasToString` does not give
correct output for `inout(T)`, i.e. `hasToString(inout(U8), char)` will return

Another viewpoint could be that `inout` should not have been applied to the
type of `text` on line 10...

Mar 11 2022