<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    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 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>
    <br>
    Sebastian<br>
  </body>
</html>