Leaving aside Thaddy's tenebrations which I feel aren't helpful, I think the issue is this.
If we replace OP's original function calc() with three identical functions calcA() through calcC() for ease of discussion:
n := calcA(2) + calcB(3) + calcC(4);
Even if the precedence and ordering of the arithmetic additions are universally agreed, there is no guarantee that the three functions calcA() through calcC() which comprise the operands are evaluated in any specified sequence.
This could possibly be viewed as an unspoken extension of the "short circuiting" of Boolean expressions:
b := boolA(2) and boolB(3) and boolC(4);
the expression will proceed from left to right in all cases, but assuming that boolA() has evaluated true then if boolB() evaluates false then either boolC() will never be evaluated, or boolC()'s result (and in theory at least) all side effects will be discarded as a casualty of speculative execution.
Interestingly, I was reading about a Pascal implementation a couple of days ago where for..do was parallelised, which resulted in the controlled statements being evaluated in arbitrary order hence as a matter of course the control variable having no defined value on completion. This sort of thing might not be done as routine (as of this year at least), but I think it's important to bear the possibility in mind as a matter of style.
MarkMLl