Did I discover a bug, or am I misunderstanding intentional behavior?
I would not expect a 'pure' function to modify a parameter.
void main()
{
import std.stdio : writeln;
int[] numbers = [5, 6, 7, 8, 9];
writeln("numbers before: ", numbers);
writeln("inner(numbers): ", inner(numbers));
writeln("numbers after : ", numbers);
}
int[] inner(int[] slice) pure
{
// This should not be pure. I broke purity by mutating slice[0]
// D compiler is not catching this!
slice[0] = 500;
if (slice.length)
{
--slice.length;
if (slice.length)
{
slice = slice[1 .. $];
}
}
return slice;
}
Output of console:
numbers before: [5, 6, 7, 8, 9]
inner(numbers): [6, 7, 8]
numbers after : [500, 6, 7, 8, 9]