When compiling the following tiny example .cxx source with "-Wall -O2", I get spurious warnings: ------------- cut example test.cxx here -------------- extern void function(void * x); struct A { long x; char d[0]; }; void test(A * a) { function((char *)a - 4); // gcc emits warning, here - why? } // ------------ struct B { char d[0]; }; void test(B * b) { char * c = (char *)b; void * v = c-1; function(v); // gcc emits warning, here - why? } ------------- cut here -------------- The output of > gcc -Wall -c test.cxx -O2 is: /tmp/test.cxx: In function ‘void test(B*)’: /tmp/test.cxx:22: warning: array subscript is below array bounds /tmp/test.cxx: In function ‘void test(A*)’: /tmp/test.cxx:10: warning: array subscript is below array bounds I have not found a sane way in my non-example, real-world code to avoid those warnings.
Because we fold the pointer addition to &a->d[-8] ;)
I'll have a look.
Subject: Bug 35593 Author: rguenth Date: Sat Mar 15 14:27:55 2008 New Revision: 133249 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=133249 Log: 2008-03-15 Richard Guenther <rguenther@suse.de> PR middle-end/35593 * tree-ssa-ccp.c (maybe_fold_offset_to_array_ref): Make sure to not produce negative array indices if not allowed. Add parameter to indicate that. (maybe_fold_offset_to_component_ref): Allow negative array indices only for the first member of a structure. (maybe_fold_offset_to_reference): Allow negative array indices. (maybe_fold_stmt_addition): Likewise. * g++.dg/warn/Warray-bounds-3.C: New testcase. Added: trunk/gcc/testsuite/g++.dg/warn/Warray-bounds-3.C Modified: trunk/gcc/ChangeLog trunk/gcc/testsuite/ChangeLog trunk/gcc/tree-ssa-ccp.c
Fixed on the trunk.
Subject: Bug 35593 Author: rguenth Date: Tue Mar 18 17:23:35 2008 New Revision: 133318 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=133318 Log: 2008-03-18 Richard Guenther <rguenther@suse.de> Backport from mainline: 2008-03-15 Richard Guenther <rguenther@suse.de> PR middle-end/35593 * tree-ssa-ccp.c (maybe_fold_offset_to_array_ref): Make sure to not produce negative array indices if not allowed. Add parameter to indicate that. (maybe_fold_offset_to_component_ref): Allow negative array indices only for the first member of a structure. (maybe_fold_offset_to_reference): Allow negative array indices. (maybe_fold_stmt_addition): Likewise. * g++.dg/warn/Warray-bounds-3.C: New testcase. Added: branches/gcc-4_3-branch/gcc/testsuite/g++.dg/warn/Warray-bounds-3.C - copied unchanged from r133249, trunk/gcc/testsuite/g++.dg/warn/Warray-bounds-3.C Modified: branches/gcc-4_3-branch/gcc/ChangeLog branches/gcc-4_3-branch/gcc/testsuite/ChangeLog branches/gcc-4_3-branch/gcc/tree-ssa-ccp.c
And the branch.
Did the patch fixes the second case (struct B)? It still warns on 4.3 branch, but no problem on 4.4.