https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91168
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |diagnostic Status|UNCONFIRMED |RESOLVED CC| |msebor at gcc dot gnu.org Resolution|--- |WONTFIX --- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> --- When reporting bugs please provide all the information requested here: https://www.gnu.org/software/gcc/bugs/#need The warning was introduced as a result of r262893. It's caused by a confluence of two factors: 1) the upper bound of the loop having a limited range (i.e., a subrange of ptrdiff_t/size_t -- compiling with -m32 suppresses it), and 2) the optimizer's necessary assumption that operator new may modify this->N. The avoid the warning either use N_ as the upper bound of the loop or change the type of S::N to size_t. The only way for GCC to avoid the warning would be to avoid assuming (for the purposes of the warning only) that operator new and other similar functions(*) clobber memory. That might be possible but I'm not sure how intrusive a change it would be or whether it's a good idea. So for now, I'm going to resolve this as WONTFIX. [*] Another function that GCC assumes clobbers memory is printf, even though in most cases it doesn't. It assumes that because the function can, in fact, clobber memory via the %n format directive and GCC doesn't scan the format string to determine whether or not it contains the directive. (The function can also clobber memory indirectly by calling a registered printf hook but that's outside the scope of what GCC needs to consider). $ cat pr91168.c && gcc -O2 -S -Wall -Wextra -Wpedantic pr91168.c int f (int *n) { const int a[] = { 1, 2 }; int x = 0; *n = 2; __builtin_printf ("n = %p\n", (void*)n); for (int i = 1; i < *n - 1; i++) x = a[i + 1]; return x; } pr91168.c: In function ‘f’: pr91168.c:10:10: warning: array subscript 2 is above array bounds of ‘const int[2]’ [-Warray-bounds] 10 | x = a[i + 1]; | ~^~~~~~~ pr91168.c:3:13: note: while referencing ‘a’ 3 | const int a[] = { 1, 2 }; | ^