Hi,
I've been rebootstrapping my switch conversion patch (which is still
waiting for review) to make sure it still works. Unfortunately, it
did not. The error given was the following and I believe this is the
warning introduced by Ian as a response to the infamous CERT advisory.
(Furthermore, I am getting this warning at revision 134664 but I was
not getting it at 134135.)
--- Compiler output ---
/cswtch/gcc/. -I/abuild/mjambor/cswtch/gcc/../include
-I/abuild/mjambor/cswtch/gcc/../libcpp/include
-I/abuild/mjambor/cswtch/gcc/../libdecnumber
-I/abuild/mjambor/cswtch/gcc/../libdecnumber/bid -I../libdecnumber
/abuild/mjambor/cswtch/gcc/tree-switch-conversion.c -o tree-switch-conversion.o
cc1: warnings being treated as errors
/abuild/mjambor/cswtch/gcc/tree-switch-conversion.c: In function
'process_switch':
/abuild/mjambor/cswtch/gcc/tree-switch-conversion.c:182: error: assuming signed
overflow does not occur when assuming that (X - c) > X is always false
make[3]: *** [tree-switch-conversion.o] Error 1
- End -
The whole switch conversion patch can be found at:
http://gcc.gnu.org/ml/gcc-patches/2008-04/msg00863.html. The code
that triggers the warning is the following, line 182 is the last one
in this snippet:
static bool
check_range (tree swtch) /* swtch is a SWITCH_EXPR */
{
tree min_case, max_case;
tree cases = SWITCH_LABELS (swtch);
int branch_num = TREE_VEC_LENGTH (cases);
min_case = TREE_VEC_ELT (cases, 0);
info.range_min = CASE_LOW (min_case);
gcc_assert (branch_num > 1);
gcc_assert (CASE_LOW (TREE_VEC_ELT (cases, branch_num - 1)) == NULL_TREE);
max_case = TREE_VEC_ELT (cases, branch_num - 2);
Now the fundamental question is, am I doing something wrong? My best
guess is that this is only a very unfortunate bogus instance of the
warning. When checking is not enabled, TREE_VEC_ELT(T, I) is expanded
to ((T)->vec.a[I]) and given that branch_num holds the number of
vector elements, I am certainly accessing an item inside the array.
On the contrary, bootstrapping is done with checking on and so
TREE_VEC_ELT expands to much more complex thing:
#define TREE_VEC_ELT_CHECK(T, I) __extension__ \
(*({__typeof (T) const __t = (T); \
const int __i = (I);\
if (TREE_CODE (__t) != TREE_VEC)\
tree_check_failed (__t, __FILE__, __LINE__, __FUNCTION__, \
TREE_VEC, 0); \
if (__i < 0 || __i >= __t->vec.length) \
tree_vec_elt_check_failed (__i, __t->vec.length, \
__FILE__, __LINE__, __FUNCTION__); \
&__t->vec.a[__i]; }))
And I guess that the second condition triggers the warning which is
then treated like an error.
Having said the above, I do not know why the TREE_VEC_ELT on the
previous line does not trigger the warning.
In the end, I basically have these questions:
1. Am I doing something wrong?
2. How can I get rid of the error and bootstrap my code?
3. If the warning is really bogus, should we perhaps turn it off for
bootstrap, (or turn it off by default in general and leave it
there for people who want to check their code after reading CERT
advisories)?
Thank you,
Martin