In Uni when it came to C and C++ we were forbidden to do many things.
One of them was to use contractions. The reason being,
for( ; AMACRO++; AMACRO<limit )
Becomes a completely random bit of code once the preprocessing has finished with it. It might, if you are lucky produce a compile error. If you are unlucky it will do something that appears valid, most of the time.
Using
for( ; AMACRO=AMACRO+1; AMACRO<limit )
Will catch more cases of inappropriate use of AMACRO than the former will. You are first ensuring the AMACRO can "store" a result in the first place. If it's a function call wrapper, then ++ will either post increment a register that will immediately be discarded or it will bomb out with a wicked compiler error.
MACRO_DEFINED_FUNCTION( parameters ) -1U
Is this asking for trouble? and relying exclusively on how that MACRO is implemented and if it was ever intended to be used that way.
In C++ it gets worse when operators can be macro'd!
The way to debug these things is unfortunately to add the "keep preprocessing output" flag and go and look at what ACTUALLY got compiled.
I don't know if it solves your problem, but just a "word from the wise", (my uni, not me).