[Issue 23319] New: std.range.Generator does not work with non-mutable elements

d-bugmail at puremagic.com d-bugmail at puremagic.com
Fri Sep 2 16:44:38 UTC 2022


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

          Issue ID: 23319
           Summary: std.range.Generator does not work with non-mutable
                    elements
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P1
         Component: phobos
          Assignee: nobody at puremagic.com
          Reporter: acehreli at yahoo.com

The following code is expected to work at least with types having no
indirections e.g. the value of an enum.

And it should work for immutable as well.

import std.range : generate;
void main() {
  generate!(() => const(int)(42));
}

/usr/include/dlang/dmd/std/range/package.d(3808): Error: cannot modify `const`
expression `this.elem_`
/usr/include/dlang/dmd/std/range/package.d(3767): Error: template instance
`std.range.primitives.isInputRange!(Generator!(function () pure nothrow @nogc
@safe => 42))` error instantiating
/usr/include/dlang/dmd/std/range/package.d(3767):        while evaluating:
`static assert(isInputRange!(Generator!(function () pure nothrow @nogc @safe =>
42)))`
/usr/include/dlang/dmd/std/range/package.d(3723): Error: template instance
`std.range.Generator!(function () pure nothrow @nogc @safe => 42)` error
instantiating


A fix would be to use Unqual inside std.range.Generator (but of course guarding
with std.traits.hasIndirections first):

      Unqual!(ReturnType!fun) elem_;

--


More information about the Digitalmars-d-bugs mailing list