> Dale Johannesen writes:
>> Nathan Sidwell wrote:
>> Also, I wonder about the following example
>>
>> int const avail = <something>
>>
>> int main() {
>> while (*(int *)&avail == Foo ())
>> do_something();
>> return 0;
>> }
>>
>> Seeing through the const-stripping cast is a useful optimization.
>
> It is? Why would somebody write that?
- It shouldn't mater, GCC should simply treat the outermost cast as the
effective definition of the qualified access path and type of the object
referenced within this context. Although it seems very reasonable that a
cast or parameter specification which results in any qualification being
dropped, minimally produces a warning, just in case the dropping of the
qualifier wasn't intended, as simply dropping a const qualifier for
example does not warrant that object referenced is actually physically
writable; i.e. for example a static const object may literally be stored
in ROM, just as array/string, or structure literals may be; just as
correspondingly dropping an objects volatile qualifier no longer warrants
that it's logical reference will result in a physically access.
>> A further pathelogical case would be,
>>
>> int main() {
>> while (*(int *)(volatile int *)&avail)
>> do_something ();
>> return 0;
>> }
>>
>> What should this do, treat the volatile qualifier as sticky?
>
> IMO, no, but surely we don't have to worry about this one. Either way
> is standard conformant and the user's intent is far from clear, so whatever
> we do should be OK.
- As above, the object should likely be simply references as if an (int *),
nothing more nothing less. With a warning that the const qualifier was
dropped upon a cast to (volatile int *), and that volatile was dropped
upon it's final cast to (int *).