https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91987
--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Another testcase, another reason: int a[4] = { 1, 2, 3, 4 }; int b[4] = { 5, 6, 7, 8 }; int foo (void) { int *x = a; int r = x[(x = b, 3)]; if (x != b) __builtin_abort (); return r; } int main () { if (foo () != 3) __builtin_abort (); } The problem here is that we somewhere fold the x[(x = b, 3)] which with -fstrong-eval-order should have well defined ordering between x and (x = b, 3) into *(x + (x = b, 3)) which is undefined.