A colleague of mine pointed out gcc gave warnings on the following constructs.
I understand a strictly conforming implementation is allowed to warn on anything,
but some of these are actually valid constructs. Wanted clarification on why gcc
wants to provide sequence-point warnings on these. Please cc me on the response,
since I am not subscribed to the list...


Thanks in advance,
Ajoy.

--
http://cs.stanford.edu/~ajoyk





a = a; /* { dg-bogus "undefined" "bogus sequence point warning" } */


  There is no multiple modification here. Think of how similar this is to:
a = a + 1;

a = fn (a++); /* { dg-bogus "undefined" "bogus sequence point warning" } */


A function call introduces a sequence point. Hence there is a sequence point between
the two modifications of 'a' here.


b++, (b + b); /* { dg-bogus "undefined" "bogus sequence point warning" } */


The comma operator introduces a sequence point. This is fully equivalent to
b++; (b + b);


(a = b++), (a = b++); /* { dg-bogus "undefined" "bogus sequence point warning" } */


  Same thing. This is equivalent to (a = b++); (a = b++);

a = (b++, b++); /* { dg-bogus "undefined" "bogus sequence point warning" } */


   Same thing.

a = b++ && b++; /* { dg-bogus "undefined" "bogus sequence point warning" } */
a = b++ || b++; /* { dg-bogus "undefined" "bogus sequence point warning" } */
a = (b++ ? b++ : a); /* { dg-bogus "undefined" "bogus sequence point warning" } */


The &&, || and ? operators introduce sequence points. The multiple modifications
to 'b' here are separated by a sequence point, and these are valid.


a = (b++ ? a : b++); /* { dg-bogus "undefined" "bogus sequence point warning" } */


  Same here.



Reply via email to