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: [email protected]
Reporter: [email protected]
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_;
--