The changes made to IFTI in DMD 2.057 are great, but they reveal another hassle with getting generic code to play nice with const.

import std.range, std.array;

ElementType!R sum(R)(R range) {
    if(range.empty) return 0;
    auto ans = range.front;
    range.popFront();

    foreach(elem; range) ans += elem;
    return ans;
}

void main() {
    const double[] nums = [1, 2, 3];
    sum(nums);
}

test.d(8): Error: variable test9.sum!(const(double)[]).sum.ans cannot modify const test.d(14): Error: template instance test9.sum!(const(double)[]) error instantiating

Of course this is fixable with an Unqual, but it requires the programmer to remember this every time and breaks for structs with indirection. Should we make `auto` also strip top-level const from primitives and arrays and, if const(Object)ref gets in, from objects?

Reply via email to