Newsgroups: comp.std.c
Path: utzoo!henry
From: henry@zoo.toronto.edu (Henry Spencer)
Subject: Re: A question on volatile accesses
Message-ID: <1990Nov3.231856.20556@zoo.toronto.edu>
Organization: U of Toronto Zoology
References: <2388@lupine.NCD.COM>
Date: Sat, 3 Nov 90 23:18:56 GMT

In article <2388@lupine.NCD.COM> rfg@lupine.ncd.com (Ron Guilmette) writes:
>	volatile int *ip;
>			i = *++ip;
>
>I'd like to know if the standard allows the incrementation of `ip'
>to occur *after* the volatile access.

It depends on what you are asking.  If I am not mistaken, it is proper for
the change to `ip' -- the variable -- to occur only after the access.
However, the access itself *must* use the incremented value, even if that
value has not yet been written back into the variable; the definition of
the prefix `++' operator demands this.

>In other words, could the program above legally be treated as:
>			i = *ip;
>			++ip;

No, although it could be treated as:

			i = *(ip + 1);
			++ip;

The volatility of the thing pointed at, by the way, has absolutely no
bearing on the issue (except insofar as a kludged-in implementation of
`volatile' may have introduced bugs).

>This seems entirely counter-intutive to me, and yet one supposedly ANSI
>C compiler provides such a treatment.

Your use of the word "supposedly" is appropriate.  The way you asked this
implies that this doesn't happen if the thing pointed at is not `volatile'.
My diagnosis would be as mentioned above:  somebody kludged `volatile' into
a compiler that originally didn't support it, and broke the prefix `++'
operator in the process.
-- 
"I don't *want* to be normal!"         | Henry Spencer at U of Toronto Zoology
"Not to worry."                        |  henry@zoo.toronto.edu   utzoo!henry
