Statements are syntactically valid, both before and after the change. But still the problem will remain. If you are modifying an object in the argument, and the order of evaluation is unspecified.
C99 Section 6.5.2.2 Paragraph 10
The order of evaluation of the function designator,the actual
arguments, and subexpressions within the actual arguments is
unspecified, but there is a sequence point before the actual call.
As per Section 3.4.4 Paragraph 1
unspecified behaviour
use of an unspecified value, or other behavior where this
International Standard provides two or more possibilities and imposes
no further requirements on which is chosen in any instance.
On the other hand Section 3.4.3 Paragraph 1 tells
undefined behaviour
behavior,upon use of a nonportable or erroneous program construct or
of erroneous data, for which this International Standard imposes no
requirement
In the case of the order or evaluation, it can be done in any order, depending on how the compiler generates the code, it might store in-memory in any order and also may pass the arguments through register. Once the code is generated, the binary will behave same everywhere. Therefore for one single binary the results will be identical every time, but depending on the decision of the compiler things can change.
The best idea is to avoid anything which seems to be incorrect or fancy. When in doubt, possibly it is an undefined, unspecified, implementation-defined behaviour. Therefore you can make the same thing unambiguous and deterministic as follows.
test (i, i+1);
i += 2;
OR
test (i+1, i);
i+= 2;
Depending on what order you want.