<div dir="ltr">I'd be surprised if Clang or GCC's behavior here varied depending on the size of anything, but maybe?<br><br>In any case, C++17 or so requires the RHS to be evaluated before the LHS for assignments - so this is now /always/ wrong, not just unspecified (which, I guess, also always wrong... just sometimes accidentally right) as it was before.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Sep 26, 2019 at 10:58 PM Martin Storsjö <<a href="mailto:martin@martin.st">martin@martin.st</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I actually ran into an elusive bug with this exact same issue some time <br>
ago as well, see <a href="https://bugs.llvm.org/show_bug.cgi?id=42065" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_bug.cgi?id=42065</a> and <br>
<a href="https://reviews.llvm.org/D62624" rel="noreferrer" target="_blank">https://reviews.llvm.org/D62624</a>.<br>
<br>
The strange thing about that bug was that it only showed up if built with <br>
GCC; Clang dereferenced the right hand side reference before evaluating <br>
the left hand side, as long as the value type was as small as the <br>
reference itself.<br>
<br>
// Martin<br>
<br>
On Thu, 26 Sep 2019, David Blaikie via llvm-dev wrote:<br>
<br>
> Yep - You'd have to separate them for correctness if "NewKey" might not<br>
> already be in "M".<br>
> <br>
> On Thu, Sep 26, 2019 at 2:48 PM Jeroen Dobbelaere via llvm-dev<br>
> <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
>       Hi,<br>
><br>
>       I have a question about llvm/ADT/DenseMap.h and<br>
>       llvm/IR/ValueMap.h:<br>
><br>
>       When you have a:<br>
>            MapType M;<br>
><br>
>       is it safe to do:<br>
>           M[NewKey] = M[OldKey];<br>
><br>
>       or do you need to do it in two steps:<br>
>          auto tmp = M[OldKey]; // ensure the reference to M[OldKey] is<br>
>       copied, before reassigning.<br>
>          M[NewKey] = tmp;      // might reallocate<br>
><br>
>       aka, will a possible allocation for M[NewKey] invalidate the<br>
>       reference that M[OldKey] returns ?<br>
><br>
>       Greetings,<br>
><br>
>       Jeroen Dobbelaere</blockquote></div>