www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 23400] New: [REG 2.099] Can't format enum value whose base

https://issues.dlang.org/show_bug.cgi?id=23400

          Issue ID: 23400
           Summary: [REG 2.099] Can't format enum value whose base type
                    has non-const opEquals
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: regression
          Priority: P1
         Component: phobos
          Assignee: nobody puremagic.com
          Reporter: snarwin+bugzilla gmail.com

As of DMD 2.100.2, the following program fails to compile:

---
struct flagenum {
    auto opEquals(typeof(this) a) {
        return false;
    }
}

enum foo { a = flagenum() }

void main() {
    import std.format: formatValue, singleSpec;
    import std.range: nullSink;

    foo bar;
    auto spec = singleSpec("%s");
    auto sink = nullSink;
    formatValue(sink, bar, spec);
}
---

The error message is:

---
/usr/include/dmd/phobos/std/format/internal/write.d(3024): Error: mutable
method `bug.flagenum.opEquals` is not callable using a `const` object
bug.d(2):        Consider adding `const` or `inout` here
/usr/include/dmd/phobos/std/format/write.d(1239): Error: template instance
`std.format.internal.write.formatValueImpl!(NullSink, foo, char)` error
instantiating
bug.d(16):        instantiated from here: `formatValue!(NullSink, foo, char)`
---

According to run.dlang.io, this is a regression introduced in Phobos 2.099:

2.079.1 to 2.098.1: Success and no output
           2.099.1: Failure with output:
-----
/path/to/dmd.linux/dmd2/linux/bin64/../../src/phobos/std/format/internal/write.d(2899):
Error: mutable method `onlineapp.flagenum.opEquals` is not callable using a
`const` object
onlineapp.d(2):        Consider adding `const` or `inout` here
/path/to/dmd.linux/dmd2/linux/bin64/../../src/phobos/std/format/write.d(1239):
Error: template instance `std.format.internal.write.formatValueImpl!(NullSink,
foo, char)` error instantiating
onlineapp.d(16):        instantiated from here: `formatValue!(NullSink, foo,
char)`
-----

--
Oct 08 2022