On Friday, 17 June 2016 at 19:59:09 UTC, kinke wrote:
// LDC issue #1433
void main()
{
    auto r = getBase()[getLowerBound($) .. getUpperBound($)];
    assert(r == [ 2, 3 ]);
}

Firstly, it fails with DMD 2.071 because $ in the upper bound expression is 0, i.e., it doesn't reflect the updated length (1) after evaluating the lower bound expression. LDC does.

The docs aren't fully detailed, but this is explicit behavior in the DMD front end that is the same no matter what type getBase() returns:

"Note that opDollar!i is only evaluated once for each i where $ occurs in the corresponding position in the indexing operation." - https://dlang.org/spec/operatoroverloading.html

"PostfixExpression is evaluated. if PostfixExpression is an expression of type static array or dynamic array, the special variable $ is declared and set to be the length of the array. " - https://dlang.org/spec/expression.html

Reply via email to