================

----------------
AaronBallman wrote:

My thinking is because "The evaluations of the operands are unsequenced." means 
there's an unsequenced access there, regardless of address computation or not. 

Volatile accesses can do *anything*, including writing new values to that 
location. Consider a situation where reading the volatile value causes the 
system to change the value to zero after the read.

On such a system, the value computations being unsequenced could be an 
observable issue. A code example of this might be:
```
extern volatile int v;
extern int *func(int *ip, volatile int value);

int main() {
  int i;
  *func(&i, v) = v;
}
```
Let's say `v` starts out with value `12` and `func()` returns its first 
argument. If the value computation of the LHS happens before RHS, then the read 
of `v` will pass the value `12` to `func()` before resetting the value of `v` 
to zero, and then `i` will be `0` because of that reset. But if the value 
computation of the RHS happens before LHS, then `func` will be passed `0` and 
`i` will be `12`.

That said, I think this might be more off in the weeds. I don't insist on a 
change here as part of this PR; this is probably better debated in a separate 
PR because it's pretty esoteric compared to the other changes in the PR which 
are more clearly helpful.

https://github.com/llvm/llvm-project/pull/180955
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to