https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85398
--- Comment #4 from Martin Sebor <msebor at gcc dot gnu.org> --- A simpler test case is this (which is analogous to what the loop is transformed into): $ cat x.c && gcc -O2 -S -Wall x.c unsigned left[1]; unsigned long right[1]; void f (unsigned i) { if (i) left[i] = right[i - 1]; } x.c: In function ‘f’: x.c:7:11: warning: array subscript [0, 0] is outside array bounds of ‘unsigned int[1]’ [-Warray-bounds] left[i] = right[i - 1]; ~~~~^~~ Here it's even more obvious that the warning is wrong. It seems to me that the whole if statement could either be eliminated or its body replaced by a trap because the assignment in it is undefined. That would eliminate the loop (and with it also the warning).