https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90387
Bug ID: 90387
Summary: [9 Regression] __builtin_constant_p and -Warray-bounds
warnings
Product: gcc
Version: 9.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: b.buschinski at googlemail dot com
Target Milestone: ---
Created attachment 46314
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46314&action=edit
gcc9_constant_array_bounds_bug.c
The attached example does not compile with GCC 9.1.0.
It gives an Warray-bounds warning, which I think is invalid, as the code path
should not be triggered as the given length parameter is not compile time
const.
It worked fine with GCC 8.3.
$ gcc-8.3.0 -O2 -Wall -Werror -c gcc9_constant_array_bounds_bug.c
$ echo $?
0
$ gcc-9.1.0 -O2 -Wall -Werror -c gcc9_constant_array_bounds_bug.c
gcc9_constant_array_bounds_bug.c: In function 'foo':
gcc9_constant_array_bounds_bug.c:6:58: error: array subscript [6, 9] is outside
array bounds of 'const char[5]' [-Werror=array-bounds]
6 | ((unsigned char*)src)[6] == ((unsigned char*)pat)[6] \
| ~~~~~~~~~~~~~~~~~~~~~^~~
gcc9_constant_array_bounds_bug.c:22:9: note: in expansion of macro 'MY_MEMCMP'
22 | MY_MEMCMP(p, pattern + state, p_len) == 0) {
| ^~~~~~~~~
gcc9_constant_array_bounds_bug.c:11:23: note: while referencing 'pattern'
11 | static char const pattern[] = "abcd";
| ^~~~~~~
cc1: all warnings being treated as errors
$ echo $?
1
The code also works fine if I change the "#if 1" to "#if 0", which confuses me
greatly.
It seems that (with the #if 1) GCC 9.1 treats "p_len" as compile-time constant,
which it is clearly not, as this is a function parameter. Or does
-Warray-bounds always check all paths? Regardless if they are impossible?
And yes, the warning would be correct if "p_len" would be compile-time const.
NOTE: I reduced the code from ~500+ lines to this, but I guess you can reduce
it further :)