statement expressions and extended asm bug?
Segher Boessenkool
segher@kernel.crashing.org
Fri Mar 19 16:25:00 GMT 2004
>>> static inline void increment (int * ptr) { *ptr++; return 0; }
>>> func (increment (&a), increment (&a));
>
>> No, it is just as undefined. The compiler is free to call
>> either the "left" or the "right" increment() first.
>
> Why is this undefined? Isn't it just unspecified? If I understand
> the DR Joseph pointed me too, the order of the two function calls
> is unspecified, but they do not overlap and there is a sequence point
> just before each call (after the arguments have been evaluated), and
> a sequence point before each returns.
Yes, I overlooked the fact that increment() always return 0, instead
of the value of *ptr++. So either order the arguments to func() are
evaluated, you get the same values, so this is fine. (with the
obvious s/void/int/ , of course).
It's just the same as
increment(&a);
increment(&a);
func(0, 0);
> The original stmt-expr problem is more akin to the following (if
> stmt-exprs
> were to produce rvalues in a return-like way),
> int var;
> static inline int frob (int x) {var = x; return var;}
> func (frob (12), frob (13));
> Are you saying this is undefined too?
The return values of the two "calls" to frob() are not
dependent on the order of those calls; so no.
Sorry for the confusion.
Segher
More information about the Gcc
mailing list