------- Additional Comments From trt at acm dot org 2005-05-12 15:08 ------- I think it is reasonable to assume the address of an auto variable is non-NULL, and so the address of anything in the local "int x[10];" is non-NULL. So gcc can (and does) fold "if (x) ..." and "if (&x[0]) ..."
gcc does not fold "if (&x[3]) ..." due to the the quirk that that it is represented as x+3 and fold does not recognize that to be non-NULL. Now consider "if (&x[i])". The only legal values for i are 0..10, which precludes any value of `i' that might cause &x[i] to be NULL. I suppose if x were a pointer, instead of an array, then we wouldn't know the legal range of values for `i'. But whatever the legal range happens to be would still (I think) preclude values which could cause &x[i] to be NULL. The argument for 'if (&p->b[3])' is more convoluted. Suppose p is non-NULL, then surely this address should be considered non-NULL for basically the same reason that &x[3] above is considered to be non-NULL. Suppose instead that p is NULL, then surely a non-zero offset added to p yields a non-NULL value. That leaves "if (&p->a)" which gcc folds even though a's offset is zero. I think this is arguably a bug. But if no one reports it as a bug ... well I think this one could be argued either way. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21474