I'm just posting to clear up the misunderstanding that a call to
a pure function can be removed. Actually, even calls to strongly
pure functions cannot always be removed. This is because there is
one thing that a pure function can do that will change program
behavior if it is removed, even if it does not change any global
state whatsoever: it can simply never return.
void foo() pure { while (true) { } }
By the way, this led to an amusing Phobos bug involving a pure
function (not) returning a struct with an enum member:
https://github.com/dlang/dmd/pull/8013#pullrequestreview-110250441 and assert(false.repeat.any == true); :)
When a strongly pure function is called multiple times with the
same parameter, all but the first call can be removed; this is
because if it was going to not return, it would already have
inf-looped the first time. pure lets you go from n to 1, but not
from 1 to 0.
A pure function that returns a value for every possible parameter
is called a total function. Unfortunately, there is no way to
enforce totality in the compiler, due to the halting problem.