https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63818
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- With the line: testouter(++i, ++i, ++i); There is no sequence point between the pre-increments of i as common inside a function call is not a sequence point. So the order of which arguments are evaluated is not defined in the standard which is why you get different behavior between two different compilers.