http://d.puremagic.com/issues/show_bug.cgi?id=2871

           Summary: Take assumes that R.opIndex(uint) returns an lvalue.
           Product: D
           Version: 2.029
          Platform: PC
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: bugzi...@digitalmars.com
        ReportedBy: dsim...@yahoo.com


import std.range, std.algorithm;

void main() {
    auto r = iota(0, 10, 1);
    assert(equal(r, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9][]));
    r = iota(0, 11, 3);
    assert(equal(r, [0, 3, 6, 9][]));
    assert(r[2] == 6);
}

C:\dmd\windows\bin\..\..\src\phobos\std\range.d(1184): Error:
this._input.opIndex(index) is not an lvalue
C:\dmd\windows\bin\..\..\src\phobos\std\range.d(4): Error: template instance
std.range.iota!(int,int,int) error instantiating

This is caused by 

    static if (isRandomAccessRange!(R))
        ref ElementType!(R) opIndex(uint index)
        {
            enforce(_maxAvailable > index);
            return _input[index];
        }

in std.range.  What is needed is some compile time reflection to determine
whether a function returns by reference or value.


-- 

Reply via email to