<html>
<head>
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
On 13.10.2011 14:24, Sebastian Redl wrote:
<blockquote cite="mid:4E96D86B.5010806@getdesigned.at" type="cite">
<meta content="text/html; charset=ISO-8859-1"
http-equiv="Content-Type">
On 13.10.2011 13:43, Abramo Bagnara wrote:
<blockquote cite="mid:4E96CECF.1000704@gmail.com" type="cite">
<pre wrap="">I want to put this gcc bug report to clang developer attention.
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50364">http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50364</a>
The gcc developers believe that according to the standard
volatile int v;
x = v = 3;
does not imply necessarily a read from v.
clang instead add a lvalue-to-rvalue implicit cast outside v = 3
assignment (and there is general consensus that lvalue-to-rvalue *is*
the marker for memory read access).
</pre>
</blockquote>
C++11 5.17 [expr.ass]p1 says:<br>
"The assignment operator (=) and the compound assignment operators
all group right-to-left. All require a modifiable lvalue as their
left operand and <b>return an lvalue referring to the left
operand</b>."<br>
So the result of (v = 3) is an lvalue referring to v, just as the
expression (v) alone. Therefore the code is equivalent to the two
separate statements:<br>
v = 3;<br>
x = v;<br>
<br>
Clang is right, GCC is wrong.<br>
</blockquote>
To clarify: this is only C++. In C, the situation is different. C99
6.5.16p3 says:<br>
"An assignment expression has the value of the left operand after
the assignment, but is not an lvalue."<br>
<br>
So in C, GCC is right, and Clang is wrong.<br>
<br>
It could be considered a defect of one of the two languages that
they differ in such a subtle detail.<br>
<br>
Sebastian<br>
</body>
</html>